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.
varchar(max)
mungkin lebih mirip OracleCLOB
VARCHAR(255)
danVARCHAR(2)
ambil jumlah ruang yang sama persis di disk! Jadi satu-satunya alasan untuk membatasi itu adalah jika Anda memiliki kebutuhan khusus untuk menjadi lebih kecil. Kalau tidak, buat semuanya 255.Khususnya, ketika melakukan penyortiran, kolom yang lebih besar memang membutuhkan lebih banyak ruang, jadi jika itu mengganggu kinerja, maka Anda perlu khawatir tentang hal itu dan membuatnya lebih kecil. Tetapi jika Anda hanya pernah memilih 1 baris dari tabel itu, maka Anda bisa membuat semuanya 255 dan itu tidak masalah.
Lihat: Berapa ukuran varchar optimal untuk MySQL?
sumber
VARCHAR(MAX)
? Space bukan satu-satunya pertimbangan saat memodelkan basis data. Domain model Anda harus mengarahkan tipe data dan ukurannya.VARCHAR(MAX)
tidak sama denganvarchar(255)
atauvarchar(65535)
- varchar max adalah tipetext
tipe data. Dan untuk titik Anda - jika dia tahu apa "domain yang dia modelkan" dia tidak akan menanyakan pertanyaan ini. Jelas dia tidak tahu seberapa besar datanya akan didapat, dan saya meyakinkannya bahwa menjadikannya ukuran penuh tidak ada salahnya.(a,b,c,d)
indeks saat keempat kolom beradaVARCHAR(255)
.Setiap kali saya membuat tabel SQL baru saya merasakan hal yang sama tentang 2 menjadi lebih "bahkan" ... tetapi untuk meringkas jawaban di sini, tidak ada dampak yang signifikan pada ruang penyimpanan hanya dengan mendefinisikan varchar (2 ^ n) atau bahkan varchar (MAX).
Yang mengatakan, Anda harus tetap mengantisipasi implikasi potensial pada penyimpanan dan kinerja ketika menetapkan batas varchar () yang tinggi. Misalnya, katakanlah Anda membuat kolom varchar (MAX) untuk menyimpan deskripsi produk dengan pengindeksan teks lengkap. Jika 99% deskripsi hanya panjang 500 karakter, dan tiba-tiba Anda mendapatkan seseorang yang menggantikan deskripsi dengan artikel wikipedia, Anda mungkin melihat penyimpanan signifikan dan hit kinerja yang tak terduga.
Hal lain yang perlu dipertimbangkan dari Bill Karwin :
Pada dasarnya, hanya datang dengan kendala bisnis yang wajar dan kesalahan pada ukuran yang sedikit lebih besar Seperti @onedaywhen tunjukkan, nama keluarga di Inggris biasanya antara 1-35 karakter. Jika Anda memutuskan untuk membuatnya menjadi varchar (64), Anda tidak akan menyakiti apa pun ... kecuali jika Anda menyimpan nama keluarga orang ini yang panjangnya mencapai 666 karakter. Dalam hal ini, mungkin varchar (1028) lebih masuk akal.
Dan jika itu membantu, inilah yang akan terlihat seperti varchar 2 ^ 5 hingga 2 ^ 10 jika diisi:
sumber
Nilai terbaik adalah yang tepat untuk data sebagaimana didefinisikan dalam domain yang mendasarinya.
Untuk beberapa domain,
VARCHAR(10)
tepat untukName
atribut, untuk domain lainVARCHAR(255)
mungkin merupakan pilihan terbaik.sumber
Menambahkan ke jawaban a_horse_with_no_name Anda mungkin menemukan yang menarik berikut ...
Jangan lupa byte panjang dan byte nullable jadi:
name varchar(100) not null
akan menjadi 1 byte (panjang) + hingga 100 karakter (latin1)name varchar(500) not null
akan menjadi 2 byte (panjang) + hingga 500 karakter (latin1)name varchar(65533) not null
akan menjadi 2 byte (panjang) + hingga 65533 karakter (latin1)name varchar(65532)
akan menjadi 2 byte (panjang) + hingga 65532 karakter (latin1) + 1 byte nolSemoga ini membantu :)
sumber
Selalu periksa dengan pakar domain bisnis Anda. Jika itu Anda, cari standar industri. Jika, misalnya, domain yang dimaksud adalah nama keluarga orang asli (nama keluarga) maka untuk bisnis di Inggris saya akan pergi ke katalog standar data UK Govtalk untuk informasi orang dan menemukan bahwa nama keluarga akan antara 1 dan 35 karakter .
sumber
Saya belum memeriksa ini akhir-akhir ini, tetapi saya tahu di masa lalu dengan Oracle bahwa driver JDBC akan memesan sepotong memori selama eksekusi permintaan untuk menahan hasil set kembali. Ukuran potongan memori tergantung pada definisi kolom dan ukuran pengambilan. Jadi panjang kolom varchar2 memengaruhi berapa banyak memori yang dipesan. Ini menyebabkan masalah kinerja serius bagi saya bertahun-tahun yang lalu karena kami selalu menggunakan varchar2 (4000) (maks pada saat itu) dan pengumpulan sampah jauh lebih efisien daripada sekarang.
sumber
Dalam arti Anda benar, meskipun apa pun yang lebih rendah dari 2 ^ 8 karakter masih akan mendaftar sebagai byte data.
Jika Anda memperhitungkan karakter dasar yang meninggalkan apa pun dengan VARCHAR <255 karena mengonsumsi jumlah ruang yang sama.
255 adalah definisi dasar yang baik kecuali Anda secara khusus ingin mengurangi input yang berlebihan.
sumber