Saya punya tabel yang berisi informasi yang sangat mendasar. Hanya judul dan beberapa bidang tanggal. Ada satu bidang yang disebut komentar yang 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
SPARSE
dan tidak menggunakanSPARSE
...Jawaban:
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 pada overhead ruang, tetapi ini minimal. Yang lebih penting adalah bagaimana satu halaman hanya dapat memuat 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.sumber
Dibutuhkan ruang minimal saat tidak digunakan
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 /programming/3793022/how-to-come-to-limits-of-8060-bytes-per-row-and-8000-per-varchar-nvarchar-valu/3793265#3793265 untuk informasi lebih lanjut
sumber
Saya pikir tabel terpisah akan lebih baik untuk meningkatkan kepadatan halaman dan mengurangi fragmentasi, terutama jika Anda tidak selalu mengisi bidang itu.
Semua halaman dan petunjuk kosong ini menyebabkan kinerja yang buruk. Normalisasikan bidang itu jika Anda bisa.
sumber
Pertanyaan ini terlihat sangat mirip: apakah kolom kosong tambahan mempengaruhi 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 sering nilai-nilai nol mempersulit para pengguna database karena mereka dapat secara tidak sengaja menggunakan nilai nol jika mereka tidak hati-hati. Oleh karena itu, kode yang menggunakan database harus berisi pemeriksaan kesalahan dan itu hanya jelek dari sana.
sumber
SPARSE
, bukan hanya "kolom dengan banyak nilai nol."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 (maks) dan opsi in / out of row. Sekali lagi, mungkin terlalu dini.
sumber