Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Praktik terbaik untuk panjang kolom SQL varchar

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa itu Skema Basis Data?

  2. MySQL – Operator Perbandingan TERKECIL dan TERBESAR

  3. Bagaimana cara meneruskan parameter ke panggilan balik kueri mysql di nodejs

  4. Panggil ke fungsi anggota execute() pada boolean di

  5. Cara Memantau Database MySQL/MariaDB menggunakan Netdata di CentOS 7