เพิ่มคอลัมน์การเปลี่ยนแปลงความเร็วในตารางขนาดใหญ่เป็น NON NULL


12

ฉันเพิ่งเพิ่มคอลัมน์บิตแบบ NULL ไปยังตารางที่มีเกือบ 500 ล้านแถว ไม่มีค่าเริ่มต้นในคอลัมน์อย่างไรก็ตามส่วนแทรกทั้งหมดกำลังระบุค่าเป็น 0 หรือ 1 และฉันใช้รูทีนแบบครั้งเดียวเพื่อกำหนด 0 หรือ 1 ให้กับแถวที่มีอยู่ทั้งหมด (อัปเดตแถวเป็นชุดเล็ก ๆ ) ตอนนี้ทุกแถวควรมี 0 หรือ 1 ในคอลัมน์นั้น

ฉันต้องการทำให้คอลัมน์บิตเป็นโมฆะไม่ได้ แต่เมื่อฉันพยายามทำมันผ่านALTER TABLE t1 ALTER COLUMN c1 bit not nullมันเริ่มทำงานเป็นเวลา 3 นาทีและฉันหยุดมันเพราะมันบล็อกการอ่านตารางทั้งหมดและฉันสงสัยว่ามันจะใช้เวลานานกว่าจะเสร็จสมบูรณ์ . เป็นไปได้ที่จะใช้เวลาไม่นาน แต่ฉันไม่สามารถเสี่ยงกับการขาดความพร้อมมากเกินไป การย้อนกลับใช้เวลา 6 นาที

คุณมีคำแนะนำใด ๆ เกี่ยวกับวิธีที่ฉันจะทำให้คอลัมน์ไม่เป็นโมฆะโดยที่ไม่ต้องใช้เวลาหลายชั่วโมงกว่าจะเสร็จ นอกจากนี้ยังมีวิธีใดที่จะประมาณว่าALTER TABLE ALTER COLUMNคำสั่งที่ฉันเริ่มและยกเลิกจะใช้เวลานานเท่าใด

ฉันใช้ SQL Server 2017 Web Edition

คำตอบ:


12

แทนที่จะเปลี่ยนนิยามคอลัมน์คุณสามารถเพิ่มCHECK CONSTRAINTที่ไม่อนุญาตให้ NULLs สำหรับคอลัมน์นั้น ตารางจะยังคงต้องสแกน แต่ไม่จำเป็นต้องแก้ไขทุกหน้าข้อมูลดังนั้นจึงควรมีการดำเนินการที่เร็วกว่ามาก น่าเสียใจล็อค Sch-M จะยังคงถูกเก็บไว้ในระหว่างการดำเนินการ เคล็ดลับหนึ่งคือพยายามดึงตารางลงในบัฟเฟอร์พูลให้ได้มากที่สุดก่อนที่จะพยายามเพิ่มข้อ จำกัด ซึ่งอาจลดระยะเวลาในการล็อค Sch-M

จากนั้นคุณสามารถลบข้อ จำกัด และเปลี่ยนคำจำกัดความของคอลัมน์ในระหว่างการบำรุงรักษาหน้าต่างถัดไป


ขอบคุณโจสำหรับความคิด ฉันเกือบจะไปพร้อมกับการเพิ่มข้อ จำกัด การตรวจสอบ แต่มีหน้าต่างการบำรุงรักษาในช่วงสุดสัปดาห์และก็สามารถเปลี่ยนคอลัมน์ให้ไม่เป็นโมฆะ ฉันไม่แน่ใจว่ามันช่วยได้หรือไม่ แต่เพื่อลองและรับข้อมูลตารางลงในบัฟเฟอร์พูลก่อนที่จะทำให้คอลัมน์ไม่เป็นโมฆะฉันก็วิ่งSELECT c1, count(*) FROM t1 GROUP BY c1ซึ่งใช้เวลาประมาณ 9 นาทีในการรัน ข้อความจริงALTER TABLE ALTER COLUMNหลังจากนั้นใช้เวลา 25 นาทีจึงจะเสร็จสมบูรณ์ ก็ไม่เลวนะ.
เบ็นอะมาดะ

11

หากคุณใช้ Enterprise Edition (EE) กลยุทธ์ที่ดีกว่าอาจเพิ่มไว้เช่นเดียวNOT NULLกับค่าเริ่มต้นของ0หรือ1(แล้วแต่จำนวนใดจะใช้กันมากที่สุด)

นี่คือการเปลี่ยนแปลงข้อมูลเมตาเท่านั้นใน EE จากนั้นอัปเดตสิ่งที่จำเป็นต้องพลิก นี่หมายถึงการอัปเดตที่น้อยลงและไม่จำเป็นต้องเปลี่ยนค่าความสามารถคอลัมน์เมื่อเสร็จแล้ว - มาร์ตินสมิ ธ


ที่น่าสนใจฉันสังเกตเห็นคุณลักษณะนี้เมื่อสัปดาห์ที่แล้วเมื่อฉันทดสอบการเพิ่มคอลัมน์บิตที่ไม่เป็นโมฆะโดยมีค่าเริ่มต้นเป็นตารางขนาดใหญ่เดียวกันนี้บนเครื่องท้องถิ่นของฉันซึ่งใช้ SQL Developer Edition - คอลัมน์ที่เพิ่มเข้ามาทันที . ในภายหลังเขาฉันว่ามันจะต้องเป็นเพราะรุ่นของนักพัฒนามีคุณสมบัติ EE
เบ็นอะมาดะ

-3

ลองคัดลอกข้อมูลไปยังตารางใหม่แล้วเปลี่ยนชื่อ คุณต้องดูแลข้อ จำกัด และดัชนีใด ๆ นั่นคือสิ่งที่นักออกแบบตาราง SSMS ทำเมื่อคุณต้องการเรียงลำดับคอลัมน์ใหม่ (ตัวอย่าง) แต่คุณควรตรวจสอบสคริปต์เพื่อดูว่ามีสิ่งใดที่ไม่ถูกต้องหรือไม่

ในระหว่างการคัดลอกการเข้าถึงการอ่านไปยังตารางต้นฉบับนั้นไม่ใช่ปัญหา แต่ถ้ามีการเขียนใด ๆ พวกเขาอาจถูกบล็อกหรือไม่ได้คัดลอกขึ้นอยู่กับระดับการแยก

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