melebih-lebihkan ukuran bidang dalam desain database

11

Saya memiliki beberapa bidang untuk tabel saya yang bersifat string dan saat ini, sebagian besar ukuran bidang memiliki batas karakter yang cukup tinggi. Misalnya, 100 karakter untuk nama jalan. Apakah ada penalti untuk menggunakan ukuran bidang yang besar? Misalnya, jika saya mengubah batas menjadi 30 karakter untuk bidang ini, apakah akan ada peningkatan kinerja atau efisiensi dengan ukuran? Akan ada sekitar 50 bidang yang bisa menjadi kandidat susut.

Terima kasih atas saran Anda.


sumber
Untuk char, ruang selalu digunakan dalam database, tetapi untuk varchar, sementara penalti akan lebih sedikit, kebutuhan untuk memiliki ruang lebih besar yang disisihkan selama operasi yang benar-benar Anda butuhkan mungkin juga masih membuatnya sedikit kurang efisien. Saya tidak akan khawatir tentang kolom varchar kecuali mereka sangat besar - seperti selalu menggunakan varchar (max) atau varchar (1000).
Cade Roux
Anda harus berhati-hati untuk melampaui ukuran satu halaman (8k) karena akan berdampak pada kinerja. Lihat pos ini: stackoverflow.com/questions/2518922/…
Mengingat rendahnya biaya hard drive, saya tidak khawatir tentang efisiensi penyimpanan hari ini. Seperti yang dikatakan JNK, ada dampak pada pengindeksan untuk bidang yang sangat besar - yang pasti perlu diingat. Rasa sakit mengubah aplikasi karena Anda mengalokasikan terlalu sedikit ruang jauh lebih besar daripada biaya beberapa byte tambahan dalam tabel database Anda.
Neville Kuyt
3
Saya pikir mengabaikan penyimpanan karena murah adalah ide yang buruk. Setiap byte pada disk harus diambil dan diproses, dan bagian paling lambat dari hampir setiap instalasi SQL Server adalah penyimpanan disk. Kurang byte = kueri yang lebih cepat.
JNK
1
Jika 100MB menyebabkan data 20% lebih sedikit untuk masuk ke dalam cache pengontrol disk 512MB, itu akan menjadi masalah (suara pengalaman).
Eric J.

Jawaban:

16

Jika Anda berbicara tentang varchardan nvarcharkemudian tidak, tidak ada penalti untuk mengizinkan panjang bidang yang lebih tinggi.


Beberapa peringatan yang perlu diingat, meskipun:

  • Ada overhead 2 byte per baris untuk bidang panjang variabel (per bidang). Jika Anda memiliki bidang yang sangat singkat, mungkin lebih masuk akal untuk menggunakan a CHAR. Varchar(2)misalnya benar-benar menggunakan antara 2-4 byte per baris, sementara CHAR(2)selalu menggunakan 2.
  • Bidang yang sangat panjang tidak dapat diindeks. Panjang maksimum untuk semua bidang dalam set kunci indeks adalah 900 byte.
  • Jika Anda mengizinkan lebih banyak data daripada yang Anda harapkan, pada akhirnya Anda akan mendapatkan hasil yang tidak terduga. Jika Anda mengizinkan 100 karakter untuk nama jalan, pada titik tertentu data lain cenderung masuk ke bidang itu tanpa Anda menyadarinya (misalnya seluruh alamat). Jika ukurannya sesuai, Anda kemungkinan akan mendapatkan kesalahan saat memasukkan.
  • Mengizinkan baris yang sangat lebar dapat menyebabkan perpecahan dan fragmentasi halaman. Jika Anda memiliki baris yang lebih panjang dari 8k, maka perlu dipecah menjadi beberapa halaman data. Banyak dari ini benar-benar dapat merusak kinerja. Lebih sempit secara umum lebih efisien.
JNK
sumber
1
Anda dapat menambahkan peringatan dalam memperpendek juga untuk jawaban ini mis. Pastikan kolom paling tidak cukup besar: address varchar (30) tidak dapat mengatasi Bolderwood Arboretum Ornamental Drive atau Northeast Kentucky Industrial Parkway .
@Aleksi - sangat benar. Saya pikir itu lebih jelas, itulah sebabnya OP menggunakan bidang luas untuk memulainya.
JNK
"pada titik tertentu data lain mungkin masuk ke bidang itu tanpa Anda menyadarinya" Poin yang menarik. Saya telah melihat banyak sistem di mana pengguna mengambil bidang apa pun yang tidak berlaku untuk catatan saat ini sebagai bidang komentar tujuan umum.
2
Bisa ada penalti
Martin Smith
2

Jika Anda maksudkan, "Apakah ada penalti untuk mendeklarasikan ukuran bidang yang lebih besar daripada nilai apa pun yang sebenarnya disimpan di dalamnya?", Maka selama dinyatakan sebagai varchar, jawabannya adalah tidak. Setiap mesin SQL DB yang saya tahu menyimpan hanya jumlah karakter yang benar-benar diberikan dalam data (ditambah nilai panjang). Jadi jika Anda mendefinisikan bidang sebagai varchar (100) tetapi hanya menyimpan 10 karakter di dalamnya, maka hanya akan memakan 10 karakter pada disk (ditambah 2 byte atau lebih untuk panjangnya). Ketika ragu, saya secara rutin membuat bidang varchar saya sangat besar.

Jika maksud Anda, "Apakah ada penalti untuk menyimpan bidang karakter yang panjang," jawabannya adalah ya. Ruang disk saat ini murah, tetapi tidak gratis, jadi Anda tidak ingin menyia-nyiakannya tanpa alasan. Mungkin lebih penting, butuh waktu untuk membaca data dari disk, jadi semakin lama bidang data Anda, semakin lambat programnya. Jika bidang diindeks, ini benar-benar dapat memperlambat pengambilan Anda, karena setiap pembacaan harus membandingkan nilai kunci terhadap bidang panjang yang besar ini.

Ingatlah bahwa jika Anda memberikan bidang entri data besar kepada pengguna, mereka akan menggunakannya, cepat atau lambat.

Semua yang dikatakan, saya akan melakukan kesalahan pada sisi terlalu besar daripada terlalu kecil. Ruang disk cukup murah sehingga Anda tidak ingin memaksa pengguna untuk membuat singkatan dengan cepat karena mereka tidak dapat memasukkan data nyata ke dalam bidang yang tersedia. Sistem yang saya kerjakan hari ini memiliki bidang deskripsi produk yang terlalu kecil untuk banyak nama asli produk kami, jadi pengguna harus menyingkat. Dan tentu saja setiap pengguna menyingkat secara berbeda, jadi kami memiliki dua puluh cara berbeda untuk mengatakan hal yang sama.

Jay
sumber
2

Siapa pun yang mengklaim bahwa tidak ada penalti untuk menyatakan ukuran bidang yang lebih besar dari apa yang sebenarnya akan disimpan dalam tabel adalah salah. Ukuran sebenarnya dari data (ditambah overhead 2 byte) adalah yang sebenarnya disimpan, tetapi definisi kolom itulah yang digunakan untuk menentukan estimasi sejauh rencana eksekusi berjalan. Jadi, ketika mendeklarasikan varchar (1000) untuk menyimpan nilai 10 karakter hanya akan memakan 12 karakter ruang disk, perkiraan rencana eksekusi akan jauh lebih efisien dan negatif untuk hasil yang miring, baik untuk berapa banyak memori untuk memberikan operasi dan apakah operasi dapat dilakukan hanya dalam memori atau apakah itu akan memerlukan ruang drive tempdb juga. Anda dapat membuat kolom Anda varchar (1000), tetapi mesin tidak tahu bahwa semua nilai tersimpan Anda benar-benar kurang dari varchar (10),

Jim
sumber
0

Pemeriksaan panjang lapangan adalah sesuatu yang Anda dapatkan 'gratis', artinya Anda tidak harus menggunakan CHECKkendala untuk melakukan hal yang sama. Dan Anda tidak ingin nilai data yang terlalu besar ketika, misalnya, Anda harus mengunggah data Anda ke basis data lain yang telah membatasi elemen data yang sama hingga 35 karakter sesuai dengan alamat standar internasional.

suatu hari nanti
sumber