สิ่งแรกสิ่งแรก: มีข้อมูลเท่าใดในตาราง จำนวนแถวและขนาดของตาราง?
ข้อสอง: คุณสามารถสำรองและกู้คืนตารางนี้ไปยังเซิร์ฟเวอร์ทดสอบและเรียกใช้คำสั่งแก้ไขเพื่อดูผลกระทบ (สมมติว่ามันไม่สามารถทำได้เนื่องจากตารางมีขนาดใหญ่เกินไปที่จะพอดีกับระบบที่ไม่ได้ใช้งานจริง)? ฉันมักจะพบว่าการทดสอบในสภาพแวดล้อมของฉันนั้นแม่นยำกว่าคำแนะนำจาก interwebs เนื่องจากมีหลายปัจจัยที่สามารถมีอิทธิพลต่อผลลัพธ์ที่อาจไม่ได้ให้ไว้ในคำถามเพียงเพราะไม่รู้ว่าปัจจัยเหล่านั้นอาจส่งผลต่อผลลัพธ์
ประการที่สาม: การเพิ่มขนาดของฟิลด์ความยาวผันแปรคือ (สมมติว่าคุณไม่ได้เกินขีด จำกัด 8060 ไบต์) การดำเนินการ meta-data อย่างง่ายเนื่องจากไม่มีข้อมูลจริงที่จะเปลี่ยนแปลงสำหรับการดำเนินการดังกล่าว แต่ในทางกลับกันการลดขนาดของเขตข้อมูลความยาวผันแปรแม้จะเป็นสิ่งที่จะเห็นได้ชัดมากกว่าการทำงานไม่ใช่การเปลี่ยนแปลง meta-data อย่างง่ายเพราะ SQL Server ไม่ทราบก่อนทำการสแกนแถวทั้งหมด ขนาดที่ร้องขอใหม่นั้นถูกต้อง
ดังนั้น: ใช่สิ่งนี้จะล็อคตารางเป็นระยะเวลาหนึ่ง ใช้เวลาเท่าไหร่ นี่คือการทดสอบที่ฉันเพิ่งทำ:
จากการทดสอบอื่น ๆ ฉันมีตารางที่มีINT NOT NULL
เขตข้อมูลเดียวและ 1 ล้านแถว ฉันคัดลอกไปยังตารางใหม่เพื่อวัตถุประสงค์ในการทำแบบทดสอบนี้ผ่าน:
SELECT *, CONVERT(NVARCHAR(MAX), NEWID()) AS [StringField]
INTO dbo.ResizeTest
FROM dbo.ClusteredUnique;
วิธีนี้ผมก็เริ่มต้นด้วยสถานการณ์ที่คล้ายกันของการมีMAX
ฟิลด์ (ฉันเพิ่งรู้ว่าคุณมีVARCHAR
และฉันใช้NVARCHAR
แต่ที่ไม่ควรปรับเปลี่ยนพฤติกรรมที่ผมเห็น) 500
ที่ฉันก็จะเปลี่ยนไป และมีข้อมูลอยู่ในนั้นที่สามารถบรรจุได้ไม่เกิน 500 ตัวอักษร ใช้เวลาไม่กี่นาที
จากนั้นฉันก็วิ่ง:
ALTER TABLE dbo.ResizeTest ALTER COLUMN [StringField] NVARCHAR(500) NULL;
และนั่นใช้เวลาเพียง 11 นาที
ฉันเพิ่งทดสอบซ้ำอีกครั้งคราวนี้วาง[ResizeTest]
ตารางและเปลี่ยนทั้งสองNVARCHAR
เป็นVARCHAR
เพียงเพื่อให้แน่ใจว่าฉันเปรียบเทียบแอปเปิ้ลกับสิ่งที่อย่างน้อยดูเหมือนแอปเปิ้ล ;-)
การสร้างตารางเริ่มต้นใช้เวลา 20 วินาทีในขณะที่ALTER TABLE
ใช้เวลา 2 นาที
ดังนั้นในแง่ของการประเมินการหยุดทำงานนั้นยากที่จะทำเพราะมันขึ้นอยู่กับความเร็วของดิสก์ I / O ไม่ว่าการดำเนินการเติบโตอัตโนมัติจะต้องเกิดขึ้นกับไฟล์ข้อมูลและ / หรือบันทึกธุรกรรม ฯลฯ หรือไม่ อาจเป็นส่วนใหญ่ของสาเหตุที่การทดสอบครั้งแรกของฉันใช้เวลา 11 นาทีในการเปลี่ยนแปลงและครั้งที่สองแม้จะมีVARCHAR
ขนาดครึ่งหนึ่งของNVARCHAR
ข้อมูลใช้เวลาเพียง 2 นาทีเท่านั้น (เช่นไฟล์ถูกสร้างไว้ล่วงหน้า ณ จุดนั้น) แต่ถึงกระนั้นคุณควรจำไว้ว่าการทดสอบของฉันทำงานบนแล็ปท็อปของฉันซึ่งไม่ใช่ดิสก์ที่เร็วที่สุด แต่มันก็เป็นเพียง 1 ล้านแถวของคอลัมน์ขนาดเล็ก 2 คอลัมน์ (22 หรือมากกว่าไบต์ต่อแถว)
และเมื่อคุณถามว่ามันจะทำอะไรกับหน้าข้อมูลนี่คือคำตอบของคุณ ฉันได้อย่างsp_spaceused
หลังจากการสร้างตารางหลังจากทำและทำหลังALTER COLUMN
ALTER TABLE dbo.ResizeTest REBUILD;
ผลลัพธ์ (ตัวเลขต่อไปนี้เป็นไปตามการทดสอบครั้งที่สองที่ใช้VARCHAR
ไม่ใช่การทดสอบครั้งแรกที่ใช้NVARCHAR
):
After initial table creation: 526,344 KB
After ALTER COLUMN VARCHAR(500): 1,031,688 KB <--- !! Yikes!!
After ALTER REBUILD: 526,472 KB
หากคุณมีความกังวลเกี่ยวกับการทำให้การดำเนินการเป็นไปได้ในระยะเวลาอันสั้นให้ตรวจสอบบทความที่ฉันเขียนเกี่ยวกับการทำเช่นนั้น: ปรับโครงสร้างตาราง 100 ล้านแถว (หรือมากกว่า) ในไม่กี่วินาที SRSLY! (ต้องลงทะเบียนฟรี)
ALTER
แก้ไขแต่ละคอลัมน์อย่างต่อเนื่อง - แต่ละการกระทำใช้เวลาน้อยกว่าหนึ่งวินาที ตามเวลาที่พวกเขาทำตารางมีขนาดสองเท่า แต่เมื่อฉันทำREBUILD
(ซึ่งก็เป็นการดำเนินการย่อยที่สอง) ตารางกลับไปที่ขนาดเดิม