Haruskah saya selalu menggunakan (n)varchar(max)
kolom teks?
Tidak.
Untuk SQL Server, max
tipe data hanya boleh ditentukan ketika tidak ada alternatif. Sebagai gantinya, seseorang harus memilih jenis pangkalan yang benar ( varchar
atau nvarchar
) dan menentukan panjang maksimum eksplisit yang sesuai dengan data yang akan disimpan.
Penyimpanan fisik identik apakah kolom tersebut diketik sebagai varchar(n)
atau varchar(max)
, sehingga tidak menjadi perhatian.
Alasan untuk tidak memilih di (n)varchar(max)
mana-mana berkisar pada fitur, kualitas rencana, dan kinerja.
Daftar lengkap mungkin tidak praktis, tetapi di antaranya, max
kolom:
fitur
- Membutuhkan batasan terpisah untuk menegakkan panjang maksimum
- Tidak dapat menjadi kunci dalam indeks (jadi tidak ada kendala unik juga)
- Dapat mencegah DDL online (termasuk pembangunan kembali indeks dan menambahkan kolom bukan-nol yang baru)
- Secara umum tidak didukung untuk fitur 'yang lebih baru' misalnya toko kolom
- Lihat dokumentasi produk untuk fitur dan batasan yang lebih spesifik. Pola umum adalah bahwa ada batasan dan pembatasan canggung di sekitar
max
tipe data. Tidak semua batasan dan efek samping didokumentasikan.
Performa
- Memerlukan penanganan khusus dalam mesin eksekusi, untuk memperhitungkan ukuran yang berpotensi sangat besar. Biasanya, ini melibatkan penggunaan jalur kode yang kurang efisien, dengan antarmuka streaming
- Mungkin memiliki konsekuensi yang tidak terduga serupa untuk kode eksternal (dan komponen SQL Server lainnya seperti SSIS), yang juga harus siap untuk menangani data hingga ukuran 2GB
- Diasumsikan selebar 4000 byte dalam perhitungan hibah memori. Ini kemungkinan mengarah pada reservasi memori yang berlebihan, yang membatasi konkurensi, dan mendorong indeks dan halaman data yang berharga keluar dari memori cache
- Nonaktifkan beberapa optimasi kinerja penting
- Dapat memperpanjang durasi kunci
- Dapat mencegah pengoptimal memilih rencana pencarian (non-dinamis)
- Cegah filter didorong ke pemindaian dan cari sebagai residu
- Dapat meningkatkan tekanan dan pertengkaran tempdb (tergantung versi), karena variabel dan parameter juga cenderung diketik
max
untuk mencocokkan definisi kolom
Singkatnya, ada begitu banyak efek samping yang halus (dan tidak diinginkan) dari penggunaan max
specifier yang tidak perlu sehingga tidak masuk akal untuk melakukan ini. 'Kenyamanan' minor dalam menggunakan satu deklarasi bukanlah semacam kompensasi.
Evaluasi setiap jenis dalam konteks, gunakan jenis dasar yang benar ( varchar
atau nvarchar
), dan panjang eksplisit yang masuk akal.
Bacaan lebih lanjut:
Paul White mengatakan GoFundMonica
sumber
varchar(not-max)
parameter, jadi saya agak menjejakkan kaki di mulut saya di sini. Tapi ya injeksi SQL akan berlaku di sini. Mungkin saya harus mengulangi jawaban ini sedikit.