Karena bagaimanapun varchar
mengalokasikan ruang secara dinamis, pertanyaan saya adalah apakah menggunakan varchar(255)
lebih efisien atau menghemat lebih banyak ruang daripada menggunakan varchar(5000)
. Jika ya, mengapa?
sql-server
Tintin
sumber
sumber
Jawaban:
Ya,
varchar(5000)
bisa lebih buruk daripadavarchar(255)
jika semua nilai cocok dengan yang terakhir. Alasannya adalah bahwa SQL Server akan memperkirakan ukuran data dan, pada gilirannya, hibah memori berdasarkan ukuran kolom yang dinyatakan (tidak aktual ) dalam sebuah tabel. Jika sudahvarchar(5000)
, Anda akan menganggap bahwa setiap nilai sepanjang 2.500 karakter, dan mencadangkan memori berdasarkan itu.Berikut ini adalah demo dari presentasi GroupBy saya baru-baru ini tentang kebiasaan buruk yang membuatnya mudah untuk dibuktikan sendiri (memerlukan SQL Server 2016 untuk beberapa
sys.dm_exec_query_stats
kolom output, tetapi masih harus dapat dibuktikan denganSET STATISTICS TIME ON
atau alat lain pada versi sebelumnya); itu menunjukkan memori lebih besar dan runtimes lebih lama untuk permintaan yang sama terhadap data yang sama - satu-satunya perbedaan adalah ukuran kolom yang dinyatakan:Jadi, ya, ukuran kolom Anda benar , tolong.
Juga, saya menjalankan kembali tes dengan varchar (32), varchar (255), varchar (5000), varchar (8000), dan varchar (maks). Hasil serupa ( klik untuk memperbesar ), meskipun perbedaan antara 32 dan 255, dan antara 5.000 dan 8.000, dapat diabaikan:
Berikut ini adalah tes lain dengan
TOP (5000)
perubahan untuk tes yang sepenuhnya dapat direproduksi yang sedang saya ganggu terus-menerus ( klik untuk memperbesar ):Jadi, bahkan dengan 5.000 baris, bukan 10.000 baris (dan ada 5.000+ baris di sys.all_columns setidaknya sejauh SQL Server 2008 R2), perkembangan yang relatif linier diamati - bahkan dengan data yang sama, semakin besar ukuran yang ditentukan dari kolom, semakin banyak memori dan waktu yang diperlukan untuk memenuhi permintaan yang sama persis (bahkan jika itu tidak memiliki arti
DISTINCT
).sumber
varchar(450)
danvarchar(255)
sama? (Atau apa pun di bawah 4000?)rowcount*(column_size/2)
.