Tidak ada DBMS yang saya tahu memiliki "pengoptimalan" yang akan membuat VARCHAR
dengan 2^n
panjang berkinerja lebih baik daripada yang memiliki max
panjang yang bukan pangkat 2.
Saya pikir versi SQL Server awal benar-benar memperlakukan VARCHAR
dengan panjang 255 berbeda dari satu dengan panjang maksimum yang lebih tinggi. Saya tidak tahu apakah ini masih terjadi.
Untuk hampir semua DBMS, penyimpanan sebenarnya yang diperlukan hanya ditentukan oleh jumlah karakter yang Anda masukkan ke dalamnya, bukan max
panjang 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 akan melihat max
panjang yang disediakan untuk VARCHAR
kolom sebagai semacam batasan (atau aturan bisnis) daripada hal teknis/fisik.
Untuk PostgreSQL, pengaturan terbaik adalah menggunakan text
tanpa batasan panjang dan CHECK CONSTRAINT
yang 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 akan menjadi VARCHAR(4000)
bukannya text
meskipun.
Saya tidak tahu apakah ada perbedaan penyimpanan fisik antara VARCHAR(max)
dan misalnya VARCHAR(500)
di SQLServer. Namun ternyata ada dampak kinerja saat menggunakan varchar(max)
dibandingkan dengan varchar(8000)
.
Lihat tautan ini (diposting oleh Erwin Brandstetter sebagai komentar)
Edit 22-09-2013
Mengenai komentar bigown:
Dalam versi Postgres sebelum 9.2 (yang tidak tersedia ketika saya menulis jawaban awal) perubahan pada definisi kolom did tulis ulang seluruh tabel, lihat mis. di sini . Sejak 9.2 ini tidak lagi terjadi dan tes cepat mengkonfirmasi bahwa meningkatkan ukuran kolom untuk tabel dengan 1,2 juta baris memang hanya membutuhkan 0,5 detik.
Untuk Oracle ini tampaknya benar juga, dilihat dari waktu yang diperlukan untuk mengubah varchar
tabel besar kolom. Tapi saya tidak bisa menemukan referensi untuk itu.
Untuk MySQL manual mengatakan
"Dalam kebanyakan kasus, ALTER TABLE
membuat salinan sementara dari tabel asli ". Dan pengujian saya sendiri mengonfirmasi bahwa:menjalankan ALTER TABLE
di atas meja dengan 1,2 juta baris (sama seperti dalam pengujian saya dengan Postgres) untuk menambah ukuran kolom membutuhkan waktu 1,5 menit. Namun di MySQL Anda tidak gunakan "solusi" untuk menggunakan batasan centang untuk membatasi jumlah karakter dalam kolom.
Untuk SQL Server saya tidak dapat menemukan pernyataan yang jelas tentang ini tetapi waktu eksekusi untuk meningkatkan ukuran varchar
kolom (sekali lagi tabel 1,2 juta baris dari atas) menunjukkan bahwa tidak penulisan ulang terjadi.
Edit 24-01-2017
Sepertinya saya (setidaknya sebagian) salah tentang SQL Server. Lihat jawaban ini dari Aaron Bertrand
yang menunjukkan bahwa panjang yang dideklarasikan dari nvarchar
atau varchar
kolom membuat perbedaan besar untuk kinerja.