Saya mencoba memahami cara terbaik untuk memutuskan seberapa besar kolom varchar seharusnya, baik dari perspektif penyimpanan dan kinerja.
Kinerja
Dari penelitian saya, tampaknyabahwa varchar (maks) hanya boleh digunakan jika Anda benar-benar membutuhkannya; yaitu, jika kolom harus mengakomodasi lebih dari 8000 karakter, salah satu alasannya adalah kurangnya pengindeksan (meskipun saya sedikit curiga pada pengindeksan pada bidang varchar secara umum. Namun saya cukup baru untuk prinsip-prinsip DB, jadi mungkin itu tidak berdasar ) dan kompresi (lebih merupakan masalah penyimpanan). Bahkan, secara umum orang-orang tampaknya merekomendasikan hanya menggunakan apa yang Anda butuhkan, ketika melakukan varchar (n) .... terlalu besar, karena permintaan harus memperhitungkan ukuran maksimum yang mungkin. Tetapi juga telah dinyatakan bahwa mesin akan menggunakan setengah dari ukuran yang ditunjukkan sebagai perkiraan dari ukuran aktual rata-rata data. Ini akan menyiratkan bahwa seseorang harus menentukan, dari data, apa ukuran rata-rata, gandakan, dan gunakan itu sebagai n. Untuk data dengan variabilitas yang sangat rendah tetapi tidak nol, ini menyiratkan hingga 2x melebihi ukuran maksimum, yang sepertinya banyak, tapi mungkin tidak? Wawasan akan dihargai.
Penyimpanan
Setelah membaca tentang bagaimana di-baris vs out-of-baris karya penyimpanan, dan dengan mengingat bahwa penyimpanan sebenarnya terbatas pada data aktual, itu benar-benar tampak bagi saya bahwa pilihan n memiliki sedikit atau tidak ada bantalan pada penyimpanan (selain Memastikan itu cukup besar untuk menampung semuanya). Bahkan menggunakan varchar (maks) tidak akan berdampak pada penyimpanan. Alih-alih, sasaran mungkin untuk membatasi ukuran aktual setiap baris data hingga ~ 8000 byte jika memungkinkan. Apakah itu pembacaan yang akurat tentang berbagai hal?
Konteks
Beberapa data pelanggan kami sedikit berfluktuasi, jadi kami biasanya membuat kolom sedikit lebih lebar dari yang seharusnya, katakanlah 15-20% lebih besar, untuk kolom-kolom itu. Saya bertanya-tanya apakah ada pertimbangan khusus lainnya; misalnya, seseorang yang bekerja dengan saya mengatakan kepada saya untuk menggunakan ukuran 2 ^ n - 1 (saya belum menemukan bukti bahwa itu masalah ....)
Saya berbicara tentang pembuatan tabel awal. Seorang pelanggan akan memberi tahu kami bahwa mereka akan mulai mengirimkan kepada kami tabel baru, dan mengirimkan data sampel (atau hanya kumpulan data produksi pertama), yang kami lihat dan buat tabel di ujung kami untuk menyimpan data. Kami ingin membuat tabel di pihak kami untuk menangani impor di masa depan serta apa yang ada dalam sampel. Tapi, baris-baris tertentu pasti akan lebih panjang, jadi kami pad mereka.
Pertanyaannya adalah berapa banyak, dan apakah ada pedoman teknis?
sumber
Jawaban:
Terlepas dari tipe data tertentu, Anda harus dapat menyimpan apa pun permintaan aplikasi untuk disimpan. Anda tidak dapat menentukan sesuatu yang lebih kecil dari ukuran maksimum dari apa yang sebenarnya akan disimpan.
Anda juga tidak perlu, atau ingin, untuk menentukan panjang kolom lebih besar dari ukuran sebenarnya maksimum yang akan disimpan karena berbagai alasan: kueri alokasi memori, berpotensi mengisi ukuran baris maksimum dan tidak meninggalkan ruang untuk menambahkan kolom di masa depan, dll.
Benar, variabel panjang string dan kolom biner tidak memiliki implikasi penyimpanan yang tipe data panjang-tetap (string / binary / numeric / date / dll) lakukan (walaupun, beberapa implikasi tersebut dapat dibatalkan melalui kompresi data atau penggunaan
SPARSE
definisi kolom. pilihan). Namun, seperti yang Anda tunjukkan, bahkan jika tidak ada implikasi penyimpanan langsung, masih ada implikasi kinerja terlalu tinggi memori yang diperlukan untuk permintaan.Masuk akal. Gunakan hanya apa yang Anda butuhkan. Pertimbangan dapat dibuat jika ada kemungkinan tinggi bahwa panjang kolom akan perlu meningkat dalam waktu dekat, tetapi perlu diingat bahwa lebih mudah untuk memperluas ukuran kolom daripada mengurangi ukuran. Ya, beberapa pekerjaan akan terlibat, tetapi karena pekerjaan itu hanya "potensial", sementara implikasi kinerja over-sizing adalah "aktual", seringkali lebih baik untuk mendefinisikan kolom berdasarkan pada apa yang sebenarnya Anda butuhkan, bukan apa yang Anda mungkin-agak -sorta pikir Anda mungkin perlu di masa depan. Banyak perubahan yang dibicarakan tidak pernah terjadi, dan seringkali perubahan yang diperlukan tidak dapat diramalkan. Pergilah dengan apa yang Anda ketahui.
Saya tidak yakin apa yang Anda dapatkan di sini. SQL Server secara fisik akan membatasi Anda hingga lebih dari 8000 byte. Menggunakan jenis LOB -
VARCHAR(MAX)
,NVARCHAR(MAX)
,VARBINARY(MAX)
,XML
, dan usangTEXT
,NTEXT
danIMAGE
jenis - memungkinkan untuk melampaui bahwa pembatasan ukuran halaman awal, tapi itu hanya karena menempatkan pointer (16 atau lebih byte, tergantung pada jenis, dan tergantung pada ukuran nilai yang disimpan secara off-line saat menggunakanMAX
tipe). Batas fisik sebenarnya dari halaman data tidak berubah.Sasaran Anda adalah menggunakan ruang fisik paling sedikit untuk menyimpan apa yang dibutuhkan aplikasi / bisnis tanpa merusak atau memotong sehingga nilai yang tidak lengkap kehilangan makna atau menyebabkan masalah di hilir. Jika Anda perlu menyimpan 12.000 karakter, kemudian gunakan
VARCHAR(MAX)
karena itulah yang diperlukan. Jika Anda menyimpan nomor telepon atau kode pos, maka itu tidak bijaksana untuk digunakanVARCHAR(100)
, dan tidak bertanggung jawab untuk menggunakannyaVARCHAR(MAX)
.Bukankah semua sistem memiliki setidaknya beberapa data yang berfluktuasi? Sistem apa pun yang menyimpan nama seseorang akan memenuhi syarat, bukan? Ada variasi yang cukup besar dalam panjang nama. Dan kemudian Anda memiliki seseorang seperti Pangeran pergi dan mengubah nama mereka menjadi simbol dan sekarang Anda memiliki masalah yang sama sekali berbeda yang tidak panjang. Begitulah keadaannya.
Tetapi, untuk berperan sebagai advokat iblis untuk sesaat: bagaimana mungkin nilai "15-20% lebih besar dari yang dibutuhkan" tidak menjadi nilai yang sebenarnya dibutuhkan ? Katakanlah ada diskusi tentang menambahkan kolom baru, dan seseorang menyarankan 50 karakter, lalu orang lain berkata, "20% lebih banyak adalah 60, jadi mari kita lakukan 60 karena seseorang mungkin memiliki 60." Jika benar bahwa pelanggan mungkin memiliki 60, maka 60 adalah, dan selalu, nilai yang sebenarnya dibutuhkan, dan 50 salah sepanjang waktu.
Tentu saja, akan membantu jika ada beberapa indikasi mengenai sumber data karena:
VARCHAR
dan mendapatkan keluhan bahwa itu mengacaukan karakter Unicode yang sekarang diizinkan dalam nama domain, maka itu harusNVARCHAR
), tapiProductSKU
lebih baik cukup besar untuk memenuhi semua SKU pelanggan.Anda membuat banyak asumsi di sini. Tentu beberapa bidang mungkin menjadi lebih besar. Tetapi sekali lagi, mereka mungkin tidak. Atau, beberapa bisa menjadi lebih kecil. Beberapa dapat berubah dari non-Unicode menjadi Unicode (begitu mereka menyadari bahwa dunia semakin kecil dan orang tidak dapat berasumsi bahwa nama-nama terakhir hanya akan memiliki karakter ASCII / US English dasar). Atau, mereka bisa berhenti mengirim bidang. Atau mereka dapat menambahkan satu atau beberapa bidang di masa mendatang. Kombinasi apa pun dari ini dan hal-hal lain. Jadi mengapa hanya fokus pada
VARCHAR
kolom? Bagaimana jika mereka saat ini mengirimkanINT
nilai dan dalam satu atau dua tahun mereka mencapai nilai maksimal dan mulai mengirim nilaiBIGINT
? Bagaimana jika mereka memiliki bidang "status" dengan nilai 0 - 5. Apakah Anda hanya akan menganggapINT
yang "empuk" karena memungkinkan untuk pertumbuhan, tetapi mungkin seharusnyaTINYINT
?Satu-satunya hal yang dapat Anda prediksi dengan aman adalah mencoba memprediksi bagaimana data pelanggan Anda akan berubah lebih sering salah daripada benar. Dan menjadi benar adalah masalah keberuntungan / kebetulan (jika bukan keberuntungan, maka mainlah lotere;).
Jadi pedomannya adalah:
Anda sudah memiliki contoh data, bagus. Tetapi, jangan lupa bahwa Anda juga memiliki info kontak pelanggan Anda: telepon dan / atau email. Hubungi mereka! Tanyakan spesifikasi data mereka (seperti sistem Anda, data yang saat ini ada di sistem mereka mungkin memiliki panjang maksimal 35, tetapi sistem mereka menetapkannya sebagai
VARCHAR(50)
, dan sistem mereka akan menerima hingga sejauh itu, dalam hal ini Anda harus menggunakan 50). Dan, tanyakan kepada mereka apakah mereka memiliki rencana jangka pendek untuk mengubah dan tipe-tipe data tersebut (tipe dan / atau ukuran).sumber
varchar(255)
dan avarchar(256)
untuk beberapa pertimbangan lebih lanjut