ไม่มี 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
คอลัมน์นั้นสร้างความแตกต่างอย่างมากสำหรับประสิทธิภาพ