Haruskah saya menggunakan varchar(255)
atau varchar(256)
ketika mendesain tabel? Saya pernah mendengar satu byte digunakan untuk panjang kolom, atau untuk menyimpan metadata.
Apakah itu penting lagi pada saat ini?
Saya melihat beberapa posting di internet, tetapi mereka berlaku untuk Oracle dan MySQL.
Kami memiliki Microsoft SQL Server 2016 Enterprise Edition, bagaimana itu berlaku untuk lingkungan ini?
Sekarang katakan misalnya, bagaimana jika saya memberi tahu klien saya untuk menyimpan misalnya, deskripsi teks ke 255 karakter, bukan 256, apakah ada perbedaan? Apa yang saya baca "Dengan panjang maksimal 255 karakter, DBMS dapat memilih untuk menggunakan satu byte untuk menunjukkan panjang data di lapangan. Jika batasnya 256 atau lebih besar, diperlukan dua byte." Apakah ini benar?
Jawaban:
Ukuran masing-masing dan setiap kolom dengan tepat. JANGAN gunakan ukuran "standar" untuk setiap kolom. Jika Anda hanya membutuhkan 30 karakter, mengapa membuat kolom yang dapat menangani 255? Saya sangat senang Anda tidak menganjurkan penggunaan
varchar(max)
untuk kolom string Anda.Ini adalah saran yang sangat bijaksana jika Anda perlu mengindeks kolom, atau jika Anda menggunakan kolom sebagai kunci utama dan memiliki referensi kunci asing. SQL Server menggunakan ukuran setiap kolom dalam pengoptimal kueri untuk memahami perkiraan kebutuhan memori untuk pemrosesan kueri. Memiliki kolom yang terlalu besar dapat merusak kinerja.
Indeks pada kolom yang terlalu besar dapat menyebabkan kesalahan yang dihasilkan:
Upaya untuk membuat indeks di atas menghasilkan peringatan ini:
900 byte adalah ukuran kunci maksimum untuk indeks berkerumun (dan indeks non-berkerumun di SQL Server 2012 dan lebih lama). 1700 byte adalah ukuran kunci maksimum untuk indeks yang tidak berkerumun pada versi SQL Server yang lebih baru. Jika Anda mendesain kolom dengan lebar umum, seperti (255), Anda mungkin mengalami peringatan ini jauh lebih sering dari yang diharapkan.
Jika Anda tertarik dengan penyimpanan internal, Anda dapat menggunakan tes kecil berikut untuk lebih memahami bagaimana SQL Server menyimpan data baris-toko terkompresi.
Pertama, kami akan membuat tabel tempat kami dapat menyimpan kolom dengan berbagai ukuran:
Sekarang kita akan memasukkan satu baris:
Kueri ini menggunakan fungsi tidak terdokumentasi, dan tidak didukung,
sys.fn_RowDumpCracker
dansys.fn_PhyslocCracker
untuk menampilkan beberapa detail menarik tentang tabel:Output akan terlihat mirip dengan ini:
Seperti yang Anda lihat, nilai
InRowLength
masing-masing ditampilkan, bersama dengan lokasi penyimpanan fisik setiap baris - "file_id", "page_id", dan "slot_id".Jika kita mengambil
file_id
danpage_id
menghargai dari hasil kueri di atas dan menjalankannyaDBCC PAGE
, kita dapat melihat konten halaman fisik yang sebenarnya:Hasil dari mesin saya adalah:
sumber
Yang lain telah menunjukkan bahwa jumlah byte yang diperlukan untuk menyimpan panjangnya telah diperbaiki. Saya ingin fokus pada bagian ini dalam pertanyaan Anda:
Anda memiliki pertanyaan yang ditandai dengan edisi perusahaan, yang umumnya berarti Anda memiliki cukup banyak data. Seringkali perbedaan satu byte per baris benar-benar tidak terlalu penting dalam praktiknya. Misalnya, tabel berikut dengan
VARCHAR(255)
kolom yang terisi penuh membutuhkan ruang 143176 KB pada disk:Hasil:
Mari kita buat tabel kedua dengan
VARCHAR(256)
kolom yang terisi penuh . Itu akan mengambil setidaknya satu byte lagi per baris, kan?Hasil:
Kebetulan kedua tabel mengambil jumlah ruang yang sama. Jumlah baris yang sama cocok untuk setiap halaman 8k. Sangat menyenangkan bahwa Anda ingin menghabiskan waktu untuk mengoptimalkan aplikasi Anda, tetapi saya curiga Anda lebih baik fokus pada bidang yang berbeda.
sumber
Ukuran varchar yang dideklarasikan tidak memiliki dampak kinerja. Data mungkin sebenarnya disimpan sebagai rowstore dengan kompresi halaman atau kompresi baris. Sebagai Clumned Columnstore, atau sebagai tabel Dioptimalkan-Memori. Masing-masing akan memiliki trade-off kinerja yang berbeda, tetapi tidak masalah apakah Anda mendeklarasikan varchar (255) atau varchar (256).
sumber