ฉันควรใช้(n)varchar(max)
สำหรับคอลัมน์ข้อความเสมอหรือไม่
เลขที่
สำหรับ SQL Server max
ควรระบุชนิดข้อมูลเฉพาะเมื่อไม่มีทางเลือกอื่น หนึ่งควรเลือกประเภทฐานที่ถูกต้อง ( varchar
หรือnvarchar
) และระบุความยาวสูงสุดที่ชัดเจนที่เหมาะสมกับข้อมูลที่จะจัดเก็บ
ที่เก็บข้อมูลฟิสิคัลจะเหมือนกันไม่ว่าจะเป็นคอลัมน์ที่พิมพ์varchar(n)
หรือvarchar(max)
ดังนั้นจึงไม่น่ากังวล
เหตุผลที่ไม่เลือกที่จะ(n)varchar(max)
หมุนไปรอบ ๆ คุณสมบัติคุณภาพแผนและประสิทธิภาพ
รายการครบถ้วนสมบูรณ์อาจไม่เป็นประโยชน์ แต่เหนือสิ่งอื่นใดmax
คอลัมน์:
คุณสมบัติ
- ต้องการข้อ จำกัด แยกต่างหากเพื่อบังคับใช้ความยาวสูงสุด
- ไม่สามารถเป็นคีย์ในดัชนี (ดังนั้นจึงไม่มีข้อ จำกัด ที่ไม่เหมือนกัน)
- อาจป้องกัน DDL ออนไลน์ (รวมถึงการสร้างดัชนีใหม่และเพิ่มคอลัมน์ที่ไม่ใช่ค่าว่างใหม่)
- โดยทั่วไปจะไม่รองรับคุณสมบัติ 'ใหม่กว่า' เช่นคอลัมน์
- ดูเอกสารประกอบของผลิตภัณฑ์สำหรับคุณสมบัติและข้อ จำกัด เฉพาะเพิ่มเติม รูปแบบทั่วไปคือมีข้อ จำกัด และข้อ จำกัด ที่น่าอึดอัดใจเกี่ยวกับ
max
ชนิดข้อมูล ไม่ใช่ข้อ จำกัด และผลข้างเคียงทั้งหมดที่มีการบันทึกไว้
ประสิทธิภาพ
- จำเป็นต้องมีการจัดการเป็นพิเศษในเอ็นจินการดำเนินการเพื่อพิจารณาขนาดที่ใหญ่มาก โดยทั่วไปแล้วสิ่งนี้จะเกี่ยวข้องกับการใช้เส้นทางโค้ดที่มีประสิทธิภาพน้อยกว่าด้วยอินเตอร์เฟสการสตรีม
- อาจมีผลที่ไม่คาดคิดที่คล้ายกันสำหรับรหัสภายนอก (และส่วนประกอบอื่น ๆ ของ SQL Server เช่น SSIS) ซึ่งจะต้องเตรียมพร้อมในการจัดการข้อมูลขนาดสูงสุด 2GB
- จะถือว่ามีความกว้าง 4000 ไบต์ในการคำนวณการให้สิทธิ์หน่วยความจำ สิ่งนี้มีแนวโน้มที่จะนำไปสู่การจองหน่วยความจำมากเกินไปซึ่ง จำกัด การทำงานพร้อมกันและผลักดันดัชนีและหน้าข้อมูลที่มีค่าออกจากหน่วยความจำแคช
- ปิดใช้งานการปรับปรุงประสิทธิภาพที่สำคัญหลายประการ
- อาจยืดระยะเวลาล็อค
- อาจป้องกันเครื่องมือเพิ่มประสิทธิภาพการเลือกแผน (ไม่ใช่แบบไดนามิก)
- ป้องกันตัวกรองที่ถูกผลักเข้าไปในการสแกนและค้นหาเป็นส่วนที่เหลือ
- อาจเพิ่มแรงกดดัน tempdb และการช่วงชิง (ขึ้นอยู่กับรุ่น) เนื่องจากตัวแปรและพารามิเตอร์มีแนวโน้มที่จะถูกพิมพ์
max
เพื่อจับคู่คำจำกัดความของคอลัมน์
โดยสรุปมีผลข้างเคียงมากมาย (และไม่พึงประสงค์) ที่ละเอียดอ่อนของการใช้ตัวmax
ระบุโดยไม่จำเป็นซึ่งทำให้ไม่มีเหตุผลที่จะทำเช่นนี้ 'ความสะดวกสบาย' เล็กน้อยของการใช้การประกาศเพียงครั้งเดียวนั้นไม่ใช่การชดเชย
ประเมินแต่ละประเภทในบริบทใช้ประเภทฐานที่ถูกต้อง ( varchar
หรือnvarchar
) และความยาวที่ชัดเจน
อ่านเพิ่มเติม: