it-swarm.asia

Apakah kolom kosong membutuhkan ruang dalam sebuah tabel?

Saya punya tabel yang berisi informasi yang sangat mendasar. Hanya judul dan beberapa bidang tanggal. Ada satu bidang bernama komentar yang merupakan varchar (4000) Sebagian besar waktu kami biarkan kosong, tetapi beberapa kali akan memasukkan sejumlah besar data di sini. Apakah ini desain yang sangat buruk? Atau ini hanya sedikit tidak efisien?

Saya akan menganggap membuat tabel terpisah untuk kolom ini akan lebih baik.

catatan: ini adalah sql server 2008

enter image description here

21
aron

Untuk kinerja yang lebih mudah diprediksi (dan untuk menghindari variasi baris yang tinggi per halaman), saya akan cenderung untuk menyimpan data ini dalam tabel terkait - terutama jika hanya diisi sebagian kecil dari waktu, dan terutama jika hanya diambil dalam beberapa pertanyaan. Baris di mana nilai ini NULL berkontribusi terhadap overhead ruang, tetapi ini minimal. Yang lebih penting adalah bagaimana satu halaman mungkin hanya muat dua baris dan halaman berikutnya dapat memuat 500 baris - ini benar-benar dapat memengaruhi statistik dan Anda mungkin lebih baik membagi ini sehingga disimpan secara terpisah dan tidak memengaruhi semua operasi Anda pada tabel inti.

9
Aaron Bertrand

Dibutuhkan ruang minimal saat tidak digunakan

  • satu bit dalam bitmap NULL
  • panjang dua byte (yang akan menjadi nol saat NULL)

Biaya overhead minimal dan optimisasi akan prematur.

Sampai Anda tahu Anda memiliki masalah, simpan saja di satu meja. Anda mematahkan KISS dengan memperkenalkan gabungan luar dan menambahkan overhead dalam meminta data.

Lihat https://stackoverflow.com/questions/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265 # 3793265 untuk lebih

12
gbn

Saya pikir tabel terpisah akan lebih baik untuk meningkatkan kepadatan halaman dan mengurangi fragmentasi, terutama jika Anda tidak selalu mengisi bidang itu.

  • Halaman data menampung sekitar 8000 byte
  • Anda memiliki beberapa baris dengan mengatakan 100 byte dan beberapa baris dengan lebih dari 4000 byte
  • Baris panjang itu akan berada di halaman sendiri, dan sisa halaman itu adalah ruang "terbuang" yang digunakan oleh DB Anda tetapi kemungkinan tidak akan pernah menyimpan data
  • Jika Anda menambahkan data ke bidang panjang itu untuk catatan di sebagian besar halaman penuh, itu kemungkinan akan membanjiri halaman dan menghasilkan pointer ke halaman dengan sisa catatan

Semua halaman dan petunjuk kosong ini menyebabkan kinerja yang buruk. Normalisasikan bidang itu jika Anda bisa.

11
JNK

Pertanyaan ini terlihat sangat mirip: apakah kolom kosong tambahan memengaruhi ukuran tabel sql secara signifikan?

Sepertinya jawabannya adalah ya memang tidak memakan tempat, tetapi ada algoritma kompresi untuk kolom dengan banyak nilai nol.

Sejauh desain, saya pikir memiliki tabel eksternal yang terhubung dengan ini akan menjadi desain yang lebih bersih. Memiliki kolom dengan nilai null yang sering membuat lebih sulit pada pengguna database karena mereka dapat secara tidak sengaja menggunakan nilai nol jika mereka tidak berhati-hati. Oleh karena itu, kode yang menggunakan database harus berisi pemeriksaan kesalahan dan itu hanya jelek dari sana.

4
hbtest

Anda akan baik-baik saja - itu sudah menjadi kolom varchar, jadi itu hanya menggunakan ruang ketika berisi data. Jika Anda memiliki banyak kolom ukuran tetap nullable seperti int, Anda mungkin memiliki masalah penggunaan ruang.

Sejauh menaruhnya di meja lain, aku tidak akan repot. Anda juga bisa melihat menggunakan varchar (max) dan opsi in/out of row. Sekali lagi, mungkin terlalu dini.

2
Cade Roux