เมื่อเปลี่ยนขนาดของคอลัมน์ nvarchar ฉันจำเป็นต้องทำดัชนีที่ไม่ซ้ำหรือไม่? และตารางจะถูกล็อคเมื่อสร้างดัชนีใหม่หรือไม่


14

ในฐานข้อมูลของเรามีตารางขนาดใหญ่ที่มีลักษณะคล้ายกันมากขึ้นหรือน้อยลง:

CREATE TABLE dbo.production_data
(
    pd_id BIGINT PRIMARY KEY,
    serial NVARCHAR(16) NOT NULL UNIQUE,
    ...
);

แต่ตอนนี้ขนาดของเขตข้อมูลอนุกรมกลายเป็นต่ำดังนั้นฉันต้องการเปลี่ยนเป็น 32 schema Visual Studio เปรียบเทียบเครื่องมือแนะนำการทำเช่นนี้โดย:

DROP INDEX ux_production_data_serial ON dbo.production_data;
GO
ALTER TABLE dbo.production_data ALTER COLUMN serial NVARCHAR(32) NOT NULL;
GO
CREATE INDEX ux_production_data_serial ON dbo.production_data(serial ASC);

มันจำเป็นจริงๆหรือ? หรือมากกว่านั้นเป็นวิธีที่ประหยัดมากในการทำเช่นนี้?

เมื่อสร้างดัชนีที่ไม่ซ้ำอีกครั้งตารางของฉันจะถูกล็อคหรือไม่ เพราะนี่จะเป็นปัญหาใหญ่ (เนื่องจากตารางมี 30 ล้านแถวและฉันคิดว่าการสร้างดัชนีใหม่จะใช้เวลาค่อนข้างนาน) เนื่องจากหน้าต่างการบำรุงรักษาต่อไปคืออีกไม่กี่เดือนในอนาคต ทางเลือกของฉันคืออะไร?

คำตอบ:


24

ไม่จำเป็นต้องวางและสร้างดัชนีอีกครั้ง

เพียงแค่ใช้

ALTER TABLE dbo.production_data
  ALTER COLUMN serial NVARCHAR(32) NOT NULL; 

นี่เป็นข้อมูลเมตาที่มีการเปลี่ยนแปลงเท่านั้น

การเปลี่ยนคอลัมน์จากNVARCHAR(16)เป็นNVARCHAR(32)ไม่ส่งผลกระทบต่อที่เก็บข้อมูลเลย

การไปทางอื่น (จาก NVARCHAR(32)ไป NVARCHAR(16)) จะทำให้คุณมีข้อผิดพลาดเกี่ยวกับวัตถุที่ขึ้นอยู่กับคอลัมน์ แต่บางที Visual Studio ก็มักจะสร้างรหัสแผ่นหม้อน้ำที่แทนการตรวจสอบว่าจำเป็นจริงหรือไม่


2
สงสัยว่าเหตุใด Visual Studio จึงใช้สคริปต์เป็น DROP / CREATE INDEX อาจไม่จำเป็นอาจไม่มีเงื่อนไข CYA
Aaron Bertrand

2
@AaronBertrand - ฉันคิดว่าเป็นเพียงการเพิ่มประสิทธิภาพที่ขาดหายไปสำหรับกรณีที่ไม่จำเป็น หนังสือออนไลน์ระบุว่าจำเป็นต้องใช้ในบางกรณีที่ผลิตภัณฑ์ไม่จำเป็นต้องใช้จริงเช่นกันจนถึงการอัปเดตนี้
Martin Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.