ทำไมการเพิ่มคอลัมน์ NOT NULL ด้วยข้อ จำกัด เริ่มต้นทันที?


16
CREATE TABLE TestTab (ID INT IDENTITY(1,1), st nvarchar(100))

INSERT INTO TestTab (st) values ('a')
INSERT INTO TestTab (st) values ('b')
INSERT INTO TestTab (st) values ('c')
INSERT INTO TestTab (st) values ('d')
INSERT INTO TestTab (st) values ('e')

INSERT INTO TestTab (st) SELECT TOP 10000 st from testtab
GO 30

ALTER TABLE TestTab ADD newcol nvarchar(10) DEFAULT 'newcol'
UPDATE TestTab SET newcol = 'newcol'  --6 sec
ALTER TABLE TestTab ADD newcol1 nvarchar(10) DEFAULT 'newcol1' NOT NULL

DROP TABLE TestTab

เมื่อฉันรันสคริปต์ทดสอบนี้ALTERด้วยUPDATEจะใช้เวลา 6 วินาทีซึ่งเป็นที่เข้าใจ

อย่างไรก็ตามALTERด้วยการDEFAULT NOT NULLดำเนินการทันทีในตารางที่มีขนาดใหญ่มาก มีคำอธิบายเกี่ยวกับสาเหตุที่เกิดขึ้นทันทีหรือไม่ บนฟิสิคัลดิสก์ข้อมูลยังต้องถูกเขียนไปยังแถวทั้งหมดใช่ไหม?

ฉันพยายามดูSET STATISTICS IO ONและแผน Query แต่ดูเหมือนว่าจะไม่พร้อมใช้งานสำหรับการดำเนินการ DDL

คำตอบ:


23

ใช่การเพิ่มคอลัมน์ที่มีค่า NULL และค่าเริ่มต้นไม่ได้เขียนค่าลงในแถวทั้งหมดในเวลาที่ทำการเปลี่ยนแปลงดังนั้นจึงไม่มีการดำเนินการขนาดข้อมูลอีกต่อไป เมื่อคุณเลือกจากตารางคอลัมน์จะปรากฏจริงจากsys.system_internals_partition_columnsซึ่งป้องกันค่าทั้งหมดไม่ให้ถูกเขียน (จนกว่าจะมีการเปลี่ยนแปลง) โปรดทราบว่าวิธีนี้ใช้ไม่ได้กับข้อมูลทุกประเภทและต้องใช้ Enterprise Edition

Remus Rusanuอธิบายรายละเอียดเพิ่มเติมที่นี่:

นอกจากนี้ALTERอย่างน้อยเราก็ยังไม่สามารถแสดงแผนให้คุณได้เพราะ SQL Server ไม่ได้สร้าง แต่จะเห็น I / O คุณสามารถใช้SQL Sentry Plan Explorerได้ * ภาพหน้าจอนี้แสดงการเพิ่มคอลัมน์ c5 , "ออนไลน์" ตามที่อธิบายไว้ข้างต้นแล้วคอลัมน์อื่น, c6, "ออฟไลน์" เนื่องจากไม่รองรับประเภท LOB คุณสามารถเห็นว่า I / O ส่วนใหญ่แสดงเป็นอ่านแทนการเขียน แต่สิ่งที่บอกได้มากกว่าคือ (ไม่ถูกต้อง!) ที่UPDATEเกี่ยวข้องกับการเปลี่ยนแปลงออฟไลน์

I / O สำหรับการเปลี่ยนแปลงออนไลน์และออฟไลน์

หากคุณไม่มี Enterprise Edition ทั้งสองคำสั่งจะมีไฟล์UPDATEแนบสำรอง(และการอ่านที่เกี่ยวข้อง) (และถ้าคุณใช้ Plan Explorer รุ่นฟรีซึ่งไม่ได้รับ call stack แบบเต็มคุณจะไม่เห็นข้อมูลข้างต้น - คุณจะเห็นแผนผังข้อความว่างเปล่าเวอร์ชันที่ต้องชำระเงินจะต้องมีเวอร์ชันที่ชำระเงินเพื่อดูแบบสอบถามแบบเต็ม call stack.)

โปรดทราบว่า SQL Server จะสร้างแผนโดยประมาณแต่ไม่มีประโยชน์มาก เลย และแผนโดยประมาณสำหรับการดัดแปลงออนไลน์จะเหมือนกับแผนโดยประมาณสำหรับการแก้ไขออฟไลน์

แผนไดอะแกรมสำหรับการแก้ไขออนไลน์

* ข้อจำกัดความรับผิดชอบ: ฉันทำงานกับ SQL Sentry


4
+1: esp. สำหรับ "Enterprise Edition" ฉันสงสัยอยู่เสมอว่าทำไมมันไม่ทำงานในบางเว็บไซต์ลูกค้าของฉัน ...
RBarryYoung
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.