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


9

ฉันต้องการเปลี่ยนคอลัมน์จาก NOT NULL เป็น NULL ในตารางที่มีแถวนับล้าน ฉันได้ลองง่ายๆ

alter table Table1 ALTER COLUMN Column1 XML NULL

แต่มันต้องใช้ตลอดไป ดังนั้นนี่คือคำถามของฉัน:

  1. เหตุใดจึงใช้เวลานานกว่าจะใช้การเปลี่ยนแปลง
  2. มีวิธีที่ดีกว่าที่จะทำหรือไม่

คำตอบ:


3

1) เราต้องการข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้างที่สมบูรณ์ของตาราง + ดัชนีที่ไม่ใช่แบบคลัสเตอร์เพื่อให้เข้าใจว่าเกิดอะไรขึ้น แต่สิ่งที่ฉันสงสัยคือสิ่งที่ต้องทำกับบิตแมป NULL

โปรดดูรายละเอียดเพิ่มเติมในหัวข้อ http://www.sqlskills.com/BLOGS/PAUL/post/Misconceptions-around-null-bitmap-size.aspx

http://www.sqlskills.com/BLOGS/PAUL/post/A-SQL-Server-DBA-myth-a-day-(630)-three-null-bitmap-myths.aspx

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

http://jahaines.blogspot.com/2009/12/sql-server-2005-how-to-move-10-millions.html


6

มันจะเร็วกว่าที่:

  1. สร้างตารางใหม่ด้วยคำจำกัดความที่ถูกต้องสำหรับ Column1
  2. INSERT INTO <NewTable> SELECT * FROM <OriginalTable>;
  3. เปลี่ยนชื่อ OriginalTable เป็น OriginalTable_old; เปลี่ยนชื่อ NewTable เป็น OriginalTable
  4. ตรวจสอบและวาง OriginalTable_old

ข้อดีของที่นี่คือคุณไม่ได้ล็อคกุญแจไว้ที่ตาราง Original ในช่วงระยะเวลาของการดำเนินการ ตารางควรถูกล็อคในช่วงเปลี่ยนชื่อเท่านั้น (สมมติว่า SQL Server รองรับการเปลี่ยนชื่อระดับวัตถุ)


ใช่ SQL Server sp_renameสนับสนุนการเปลี่ยนชื่อวัตถุระดับการใช้ระบบการจัดเก็บ
gonsalu

ฉันสามารถเปลี่ยนคอลัมน์ด้วยวิธีนี้ด้วยแถว 3.5M ภายใน 1 นาที
Mohsen Afshin

2

ทุกแถวต้องได้รับการสัมผัสเมื่อเปลี่ยนคอลัมน์จาก NOT NULL เป็น NULL ซึ่งเป็นสาเหตุที่ใช้เวลานานกว่าจะเสร็จสมบูรณ์ ไม่มีวิธีใดที่จะทำให้ใช้เวลาน้อยลง


1

อีกทางเลือกหนึ่งคือการสร้างคอลัมน์ใหม่ที่มีคำจำกัดความที่ถูกต้องในตารางที่มีปัญหาอัปเดตคอลัมน์ด้วยข้อมูลจากคอลัมน์เก่าจากนั้นปล่อยคอลัมน์เก่า

หรือคุณสามารถอ้างอิงโพสต์เก่าจาก SE ที่จัดการกับปัญหาที่คล้ายกันในคอลัมน์ INT

/programming/4311559/sql-server-performance-for-alter-table-alter-column-change-data-type


ในกรณีของฉันคอลัมน์ของฉันเต็มไปด้วยค่า NULL ดังนั้นฉันคิดว่านี่เป็นวิธีที่จะไปสร้างคอลัมน์ NULL ใหม่ที่สมบูรณ์พร้อมชื่อที่ถูกต้องไม่ต้องใช้เวลาเลย ... จากนั้นลบคอลัมน์เก่า แทนที่จะจัดการกับล้านแทรก ...
แซค

0

ถ้าคุณเปิดการมอนิเตอร์กิจกรรม SQL ในขณะที่คำสั่งกำลังทำงานคุณจะสามารถบอกได้ว่ามันกำลังประมวลผลหรือไม่หรือกำลังรอการล็อกแบบเอกสิทธิ์เฉพาะบุคคลของตารางบางรูปแบบ

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