Tidak ada DBMS yang saya tahu memiliki "optimasi" yang akan membuat VARCHAR
dengan 2^n
panjang berkinerja lebih baik daripada yang dengan max
panjang yang bukan kekuatan 2.
Saya pikir versi SQL Server awal sebenarnya diperlakukan VARCHAR
dengan 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 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 harus melihat max
panjang yang disediakan untuk VARCHAR
kolom sebagai semacam kendala (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 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 varchar
kolom tabel besar . Tetapi saya tidak dapat menemukan referensi untuk itu.
Untuk MySQL , manual mengatakan " Dalam kebanyakan kasus, ALTER TABLE
buat salinan sementara dari tabel asli ". Dan tes saya sendiri mengkonfirmasi bahwa: menjalankan sebuah ALTER TABLE
di 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 varchar
kolom (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 nvarchar
atau varchar
kolom yang dinyatakan membuat perbedaan besar untuk kinerja.