Tidak ada DBMS yang saya tahu memiliki "optimasi" yang akan membuat VARCHARdengan 2^npanjang berkinerja lebih baik daripada yang dengan maxpanjang yang bukan kekuatan 2.
Saya pikir versi SQL Server awal sebenarnya diperlakukan VARCHARdengan panjang 255 berbeda dari yang dengan panjang maksimum lebih tinggi. Saya tidak tahu apakah ini masih terjadi.
Untuk hampir semua DBMS, penyimpanan aktual yang diperlukan hanya ditentukan oleh jumlah karakter yang Anda masukkan, bukan maxpanjang yang Anda tentukan. Jadi dari sudut pandang penyimpanan (dan kemungkinan besar kinerja juga), tidak ada bedanya apakah Anda mendeklarasikan kolom sebagai VARCHAR(100)atau VARCHAR(500).
Anda harus melihat maxpanjang yang disediakan untuk VARCHARkolom sebagai semacam kendala (atau aturan bisnis) daripada hal teknis / fisik.
Untuk PostgreSQL pengaturan terbaik adalah menggunakan texttanpa batasan panjang dan CHECK CONSTRAINTyang membatasi jumlah karakter untuk apa pun yang dibutuhkan bisnis Anda.
Jika persyaratan itu berubah, mengubah batasan pemeriksaan jauh lebih cepat daripada mengubah tabel (karena tabel tidak perlu ditulis ulang)
Hal yang sama dapat diterapkan untuk Oracle dan lainnya - di Oracle itu akan menjadi VARCHAR(4000)bukan text.
Saya tidak tahu apakah ada perbedaan penyimpanan fisik antara VARCHAR(max)dan misalnya VARCHAR(500)dalam SQL Server. Namun ternyata ada dampak kinerja saat menggunakan varchar(max)dibandingkan dengan varchar(8000).
Lihat tautan ini (diposting oleh Erwin Brandstetter sebagai komentar)
Edit 2013-09-22
Mengenai komentar bigown:
Dalam Postgres versi sebelum 9.2 (yang tidak tersedia ketika saya menulis jawaban awal) perubahan ke definisi kolom melakukan menulis ulang seluruh meja, lihat misalnya di sini . Sejak 9,2 ini tidak lagi terjadi dan tes cepat menegaskan bahwa meningkatkan ukuran kolom untuk tabel dengan 1,2 juta baris memang hanya butuh 0,5 detik.
Bagi Oracle hal ini tampaknya benar juga, dilihat dari waktu yang diperlukan untuk mengubah varcharkolom tabel besar . Tetapi saya tidak dapat menemukan referensi untuk itu.
Untuk MySQL , manual mengatakan " Dalam kebanyakan kasus, ALTER TABLEbuat salinan sementara dari tabel asli ". Dan tes saya sendiri mengkonfirmasi bahwa: menjalankan sebuah ALTER TABLEdi atas meja dengan 1,2 juta baris (sama seperti dalam pengujian saya dengan Postgres) untuk meningkatkan ukuran kolom butuh 1,5 menit. Namun di MySQL Anda tidak dapat menggunakan "solusi" untuk menggunakan batasan pemeriksaan untuk membatasi jumlah karakter dalam kolom.
Untuk SQL Server saya tidak dapat menemukan pernyataan yang jelas tentang ini tetapi waktu eksekusi untuk meningkatkan ukuran varcharkolom (sekali lagi tabel 1,2 juta baris dari atas) menunjukkan bahwa tidak ada penulisan ulang yang terjadi.
Edit 2017-01-24
Sepertinya saya (setidaknya sebagian) salah tentang SQL Server. Lihat jawaban ini dari Aaron Bertrand yang menunjukkan bahwa panjang nvarcharatau varcharkolom yang dinyatakan membuat perbedaan besar untuk kinerja.