Saya telah membaca ini di forum MSDN dan di sini dan saya masih belum jelas. Saya pikir ini benar: Varchar (max) akan disimpan sebagai tipe data teks, sehingga memiliki kekurangan. Jadi katakanlah bidang Anda bisa diandalkan di bawah 8000 karakter. Seperti bidang BusinessName di tabel database saya. Pada kenyataannya, nama bisnis mungkin akan selalu di bawah (menarik nomor dari topi saya) 500 karakter. Sepertinya banyak bidang varchar yang saya temui termasuk dalam jumlah karakter 8k.
Jadi, haruskah saya membuat bidang itu menjadi varchar (500), bukan varchar (8000)? Dari apa yang saya pahami tentang SQL, tidak ada perbedaan antara keduanya. Jadi, untuk membuat hidup lebih mudah, saya ingin mendefinisikan semua field varchar saya sebagai varchar (8000). Apakah itu ada kekurangannya?
Terkait: Ukuran kolom varchar (saya tidak merasa yang ini menjawab pertanyaan saya).
sumber
Jawaban:
Dari sudut pandang pemrosesan, tidak ada bedanya untuk menggunakan varchar (8000) vs varchar (500). Ini lebih merupakan jenis "praktik yang baik" untuk menentukan panjang maksimum yang harus dipegang sebuah bidang dan membuat varchar Anda sepanjang itu. Itu adalah sesuatu yang dapat digunakan untuk membantu validasi data. Misalnya membuat singkatan negara bagian menjadi 2 karakter atau kode pos / pos sebanyak 5 atau 9 karakter. Ini digunakan untuk menjadi perbedaan yang lebih penting ketika data Anda berinteraksi dengan sistem lain atau antarmuka pengguna di mana panjang bidang sangat penting (misalnya set data file datar mainframe), tetapi saat ini saya pikir itu lebih merupakan kebiasaan daripada yang lain.
sumber
Salah satu contoh di mana hal ini dapat membuat perbedaan adalah dapat mencegah pengoptimalan kinerja yang menghindari penambahan informasi pembuatan versi baris ke tabel dengan pemicu setelahnya.
Ini tercakup dalam SQL Kiwi di sini
Demikian pula jika menggunakan tabel yang dioptimalkan memori sejak 2016, dimungkinkan untuk menggunakan kolom LOB atau kombinasi lebar kolom yang berpotensi melebihi batas inrow tetapi dengan penalti.
Ini dapat berdampak negatif besar pada konsumsi dan kinerja memori
Kasus lain di mana mendeklarasikan lebar kolom dapat membuat perbedaan besar adalah jika tabel akan diproses menggunakan SSIS. Memori yang dialokasikan untuk kolom panjang variabel (non BLOB) ditetapkan untuk setiap baris dalam pohon eksekusi dan sesuai dengan panjang maksimum yang dinyatakan kolom yang dapat menyebabkan penggunaan buffer memori yang tidak efisien (contoh) . Sementara pengembang paket SSIS dapat menyatakan ukuran kolom yang lebih kecil daripada sumbernya, analisis ini paling baik dilakukan di awal dan diterapkan di sana.
Kembali ke mesin SQL Server itu sendiri kasus serupa adalah ketika menghitung hibah memori untuk mengalokasikan untuk
SORT
operasi SQL Server mengasumsikan bahwavarchar(x)
kolom rata-rata akan mengkonsumsix/2
byte.Jika sebagian besar
varchar
kolom Anda lebih penuh dari itu, ini dapat menyebabkansort
operasi tumpahtempdb
.Dalam kasus Anda, jika
varchar
kolom Anda dideklarasikan sebagai8000
byte tetapi sebenarnya memiliki konten yang jauh lebih sedikit dari itu, kueri Anda akan dialokasikan memori yang tidak diperlukan yang jelas tidak efisien dan dapat menyebabkan menunggu pemberian memori.Ini tercakup dalam Bagian 2 dari SQL Workshops Webcast 1 yang dapat diunduh dari sini atau lihat di bawah.
use tempdb; CREATE TABLE T( id INT IDENTITY(1,1) PRIMARY KEY, number int, name8000 VARCHAR(8000), name500 VARCHAR(500)) INSERT INTO T (number,name8000,name500) SELECT number, name, name /*<--Same contents in both cols*/ FROM master..spt_values SELECT id,name500 FROM T ORDER BY number
SELECT id,name8000 FROM T ORDER BY number
sumber
char(4)
karena ada 2 byte overhead per kolom variabel.Terlepas dari praktik terbaik (jawaban BBlake)
sumber
nvarchar
danvarchar
mengetik, ini hanya berarti bahwa spasi tambahan dipertahankan setelah penyisipan - bukan karena nilainya ditambah dengan spasi untuk ukuran kolom, seperti dichar
dannchar
.Ada beberapa kerugian dari kolom besar yang agak kurang jelas dan mungkin Anda ketahui nanti:
Sebagai aturan umum, cobalah konservatif dengan lebar kolom. Jika menjadi masalah, Anda dapat dengan mudah mengembangkannya agar sesuai dengan kebutuhan. Jika Anda melihat masalah memori di kemudian hari, menyusutkan kolom yang lebar nanti mungkin menjadi tidak mungkin tanpa kehilangan data dan Anda tidak akan tahu harus mulai dari mana.
Dalam contoh nama bisnis Anda, pikirkan tentang di mana Anda bisa menampilkannya. Apakah memang ada ruang untuk 500 karakter ?? Jika tidak, tidak ada gunanya menyimpannya seperti itu. http://en.wikipedia.org/wiki/List_of_companies_of_the_United_States mencantumkan beberapa nama perusahaan dan jumlah maksimumnya sekitar 50 karakter. Jadi saya akan menggunakan 100 untuk kolom maks. Mungkin lebih seperti 80.
sumber
Idealnya Anda ingin membuatnya lebih kecil dari itu, ke ukuran yang cukup panjang (500 tidak berukuran wajar) dan pastikan validasi klien menangkap saat data akan menjadi terlalu besar dan mengirim kesalahan yang berguna.
Sementara varchar tidak benar-benar akan mencadangkan ruang dalam database untuk ruang yang tidak terpakai, saya ingat versi SQL Server memiliki informasi tentang baris database yang lebih lebar dari beberapa jumlah byte (tidak ingat jumlah persisnya) dan benar-benar membuang data apa pun yang tidak sesuai. Sejumlah byte tersebut disediakan untuk hal-hal internal SQL Server.
sumber