เมื่อเพิ่มขนาดคอลัมน์ VARCHAR บนโต๊ะขนาดใหญ่อาจมีปัญหาหรือไม่?


87

ฉันใช้ SQL Server 2008 และฉันต้องการสร้างฟิลด์ VARCHAR ให้ใหญ่ขึ้นจาก (200 ถึง 1200) บนตารางที่มีแถวประมาณ 500k สิ่งที่ฉันต้องรู้คือหากมีปัญหาใด ๆ ที่ฉันยังไม่ได้พิจารณา

ฉันจะใช้คำสั่ง TSQL นี้:

ALTER TABLE MyTable
ALTER COLUMN [MyColumn] VARCHAR(1200)

ฉันได้ลองใช้กับสำเนาข้อมูลแล้วและข้อความนี้ไม่มีผลร้ายที่ฉันเห็น

มีปัญหาที่เป็นไปได้จากการทำสิ่งนี้ที่ฉันอาจไม่ได้พิจารณาหรือไม่?

อย่างไรก็ตามคอลัมน์ไม่ได้รับการจัดทำดัชนี


1
@nonnb: นั่นเป็นความคิดที่แย่มาก stackoverflow.com/q/2091284/27535
gbn

@gbn มีความคิดเห็นเกี่ยวกับคำตอบล่าสุดของจัสตินสำหรับคำถามนั้นหรือไม่? ดูเหมือนจะขัดแย้งกับคุณอยู่บ้าง
AakashM

@AakashM: เขาถูกต้องเกี่ยวกับการจัดเก็บข้อมูล แต่เป็นค่าใช้จ่ายไม่ใช่การเพิ่มประสิทธิภาพ ตอนนี้อ่านstackoverflow.com/q/2009694/27535
gbn

@gbn - จุดดีเช่นเดียวกับข้อสังเกตของ Martin Smith ในการจัดทำดัชนี ถอน
StuartLC

2
ปรากฎว่าในที่สุดมี gotcha หนึ่งอัน! ฟิลด์ถูกจัดทำดัชนีและเมื่อมีคนพยายามป้อนรายการที่ใหญ่กว่า 900b ก็ล้มเหลว! ขอเตือน.
Paul T Davies

คำตอบ:


59

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

ข้อสังเกต: ระบุ NULL หรือ NOT NULL อย่างชัดเจนเพื่อหลีกเลี่ยง "อุบัติเหตุ" หากการตั้งค่า SET ANSI_xx แตกต่างกันเช่นรันใน osql ไม่ใช่ SSMS ด้วยเหตุผลบางประการ


1
ทุกอย่างเป็นไปด้วยดีกับสิ่งนี้ ไม่มีปัญหา.
Paul T Davies

คุณรู้หรือไม่ว่ากฎเดียวกันนี้ใช้เมื่อไปจากvarchar(200)ที่varchar(max)ใด
CodeNaked

@CodeNaked: นี่เป็นคำตอบที่ยากกว่ามาก (สูงสุด) เป็นประเภทลอบซึ่งสามารถเป็น "ในแถว" หรือนอกแถว อย่างไรก็ตามฉันมีแนวโน้มที่จะบอกว่ามันควรจะเหมือนกันเพราะข้อมูลนั้น "อยู่ในแถว" อยู่แล้วและไม่จำเป็นต้องสร้างตารางใหม่
gbn

12

แค่อยากจะเพิ่ม 2 เซ็นต์ของฉันเนื่องจากฉัน googled คำถามนี้ b / c ฉันพบว่าตัวเองอยู่ในสถานการณ์ที่คล้ายกัน ...

ควรระวังว่าในขณะที่เปลี่ยนจากvarchar(xxx)การvarchar(yyy)มีการเปลี่ยนแปลงข้อมูลเมตาแน่นอน แต่เปลี่ยนไปvarchar(max)ไม่ได้ เนื่องจากvarchar(max)ค่า (หรือที่เรียกว่าค่า BLOB - รูปภาพ / ข้อความ ฯลฯ ) จะถูกจัดเก็บแตกต่างกันในดิสก์ไม่ใช่ในแถวตาราง แต่เป็น "นอกแถว" ดังนั้นเซิร์ฟเวอร์จะหยุดบนโต๊ะขนาดใหญ่และไม่ตอบสนองเป็นเวลาหลายนาที (ชั่วโมง)

--no downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200)

--huge downtime
ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(max)

ปล. เช่นเดียวกับnvarcharหรือหลักสูตร


4

การเปลี่ยนเป็น Varchar (1200) จาก Varchar (200) จะทำให้คุณไม่มีปัญหาเนื่องจากเป็นเพียงการเปลี่ยนแปลงข้อมูลเมตาและเนื่องจาก SQL Server 2008 ตัดช่องว่างที่มีอยู่คุณจะไม่เห็นความแตกต่างของประสิทธิภาพดังนั้นในระยะสั้นไม่ควรมีปัญหากับการสร้าง เปลี่ยนแปลง.


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

0

อีกเหตุผลหนึ่งที่คุณควรหลีกเลี่ยงการแปลงคอลัมน์เป็น varchar (สูงสุด) เนื่องจากคุณไม่สามารถสร้างดัชนีในคอลัมน์ varchar (สูงสุด) ได้


-3

ในกรณีของฉันคอลัมน์แก้ไขไม่ทำงานดังนั้นจึงสามารถใช้คำสั่ง 'Modify' เช่น:

แก้ไขตาราง [table_name] คอลัมน์ MODIFY [column_name] varchar (1200);


5
นั่นเป็นเพราะคุณไม่ได้ใช้ SQL Server ตามคำถาม (แต่อาจเป็น MySQL) "แก้ไขตาราง ... แก้ไข" ไม่ใช่ T-SQL ที่ถูกต้อง
Jeroen Mostert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.