ไม่มี DBMS ที่ฉันรู้ว่ามี "การเพิ่มประสิทธิภาพ" ใด ๆ ที่จะทำให้ a ที่VARCHARมี2^nความยาวทำงานได้ดีกว่าหนึ่งที่มีmaxความยาวที่ไม่ใช่พลังของ 2
ฉันคิดว่าเวอร์ชันก่อนหน้าของ SQL Server นั้นใช้งานได้จริง VARCHARกับมีความยาว 255 แตกต่างจากที่มีความยาวสูงสุดที่สูงกว่า ฉันไม่รู้ว่านี่เป็นกรณีนี้หรือไม่
สำหรับ DBMS เกือบทั้งหมดพื้นที่เก็บข้อมูลจริงที่ต้องใช้นั้นพิจารณาจากจำนวนอักขระที่คุณใส่เท่านั้นไม่ใช่maxความยาวที่คุณกำหนด ดังนั้นจากมุมมองที่เก็บข้อมูล (และอาจเป็นประสิทธิภาพหนึ่งเช่นกัน) ก็ไม่ได้สร้างความแตกต่างไม่ว่าคุณจะประกาศคอลัมน์เป็นVARCHAR(100)หรือVARCHAR(500)หรือ
คุณควรดูmaxความยาวที่ระบุสำหรับVARCHARคอลัมน์เป็นข้อ จำกัด (หรือกฎทางธุรกิจ) แทนที่จะเป็นเรื่องทางเทคนิค / ทางกายภาพ
สำหรับ PostgreSQL การตั้งค่าที่ดีที่สุดคือการใช้งานtextโดยไม่จำกัดความยาวและCHECK CONSTRAINTจำนวนอักขระที่ จำกัด ให้กับธุรกิจของคุณ
หากความต้องการนั้นเปลี่ยนแปลงไปการเปลี่ยนแปลงข้อ จำกัด การตรวจสอบนั้นเร็วกว่าการเปลี่ยนแปลงตาราง (เนื่องจากตารางไม่จำเป็นต้องเขียนใหม่)
เช่นเดียวกับที่สามารถนำมาใช้สำหรับ Oracle และอื่น ๆ - ใน Oracle มันจะVARCHAR(4000)แทนtextแม้ว่า
ฉันไม่รู้ว่ามีความแตกต่างของหน่วยเก็บข้อมูลจริงหรือไม่ระหว่างVARCHAR(max)และVARCHAR(500)ใน SQL Server แต่เห็นได้ชัดว่ามีผลกระทบต่อประสิทธิภาพเมื่อใช้เมื่อเทียบกับvarchar(max)varchar(8000)
ดูลิงค์นี้ (โพสต์โดย Erwin Brandstetter เป็นความคิดเห็น)
แก้ไข 2013-09-22
เกี่ยวกับความคิดเห็นของ bigown:
ในรุ่น Postgres ก่อน 9.2 (ซึ่งไม่พร้อมใช้งานเมื่อฉันเขียนคำตอบเริ่มต้น) การเปลี่ยนแปลงคำจำกัดความของคอลัมน์ไม่ได้เขียนทั้งตารางใหม่ดูที่นี่ที่นี่ตั้งแต่ 9.2 นี่ไม่ใช่กรณีอีกต่อไปและการทดสอบอย่างรวดเร็วยืนยันว่าการเพิ่มขนาดคอลัมน์สำหรับตารางที่มี 1.2 ล้านแถวใช้เวลาเพียง 0.5 วินาทีเท่านั้น
สำหรับ Oracle สิ่งนี้ดูเหมือนจะเป็นจริงเช่นกันโดยพิจารณาตามเวลาที่ใช้ในการเปลี่ยนแปลงvarcharคอลัมน์ของตารางขนาดใหญ่ แต่ฉันไม่พบการอ้างอิงใด ๆ
สำหรับ MySQL คู่มือบอกว่า " ในกรณีส่วนใหญ่ALTER TABLEทำสำเนาชั่วคราวของตารางต้นฉบับ " และการทดสอบของฉันเองยืนยันว่า: การรันALTER TABLEบนตารางที่มี 1.2 ล้านแถว (เช่นเดียวกับในการทดสอบของฉันกับ Postgres) เพื่อเพิ่มขนาดของคอลัมน์ใช้เวลา 1.5 นาที ใน MySQL อย่างไรก็ตามคุณไม่สามารถใช้ "วิธีแก้ไข" เพื่อใช้ข้อ จำกัด การตรวจสอบเพื่อ จำกัด จำนวนอักขระในคอลัมน์
สำหรับ SQL Server ฉันไม่พบคำสั่งที่ชัดเจนเกี่ยวกับเรื่องนี้ แต่เวลาดำเนินการเพื่อเพิ่มขนาดของvarcharคอลัมน์ (อีกตาราง 1.2 ล้านแถวจากด้านบน) บ่งชี้ว่าไม่มีการเขียนซ้ำเกิดขึ้น
แก้ไข 2017-01-24
ดูเหมือนว่าฉันผิด (อย่างน้อยบางส่วน) เกี่ยวกับ SQL Server ดูคำตอบนี้จากแอรอนเบอร์ทรานด์ที่แสดงให้เห็นว่าความยาวที่ประกาศnvarcharหรือvarcharคอลัมน์นั้นสร้างความแตกต่างอย่างมากสำหรับประสิทธิภาพ