Saya punya meja dengan 490 M baris dan 55 GB ruang tabel, jadi sekitar 167 byte per baris. Tabel ini memiliki tiga kolom: a VARCHAR(100)
, a DATETIME2(0)
, dan a SMALLINT
. Panjang rata-rata teks di VARCHAR
lapangan adalah sekitar 21,5, sehingga data mentah harus sekitar 32 byte per baris: 22 + 2 untuk VARCHAR
, 6 untuk DATETIME2
, dan 2 untuk bilangan bulat 16-bit.
Perhatikan bahwa ruang di atas hanya data, bukan indeks. Saya menggunakan nilai yang dilaporkan di bawah Properties | Penyimpanan | Umum | Ruang data.
Tentu saja harus ada beberapa overhead, tetapi 135 byte per baris sepertinya banyak, terutama untuk tabel besar. Kenapa ini bisa terjadi? Adakah yang melihat pengganda serupa? Faktor-faktor apa yang dapat memengaruhi jumlah ruang ekstra yang dibutuhkan?
Sebagai perbandingan, saya mencoba membuat tabel dengan dua INT
bidang dan 1 baris M. Ruang data yang dibutuhkan adalah 16,4 MB: 17 byte per baris, dibandingkan dengan 8 byte data mentah. Tabel tes lain dengan INT
dan VARCHAR(100)
diisi dengan teks yang sama seperti tabel nyata menggunakan 39 byte per baris (44 K baris), di mana saya harapkan 28 ditambah sedikit.
Jadi tabel produksi memiliki overhead yang jauh lebih besar. Apakah ini karena lebih besar? Saya berharap ukuran indeks kira-kira N * log (N), tapi saya tidak melihat mengapa ruang yang diperlukan untuk data aktual menjadi non-linear.
Terima kasih sebelumnya untuk petunjuk apa pun!
EDIT:
Semua bidang yang tercantum adalah NOT NULL
. Tabel sebenarnya memiliki PK berkerumun di VARCHAR
lapangan dan DATETIME2
lapangan, dalam urutan itu. Untuk dua tes, yang pertama INT
adalah PK (berkerumun).
Jika penting: tabel adalah catatan hasil ping. Bidangnya adalah URL, tanggal / waktu ping, dan latensi dalam milidetik. Data secara konstan ditambahkan, dan tidak pernah diperbarui, tetapi data dihapus secara berkala untuk menguranginya menjadi hanya beberapa catatan per jam per URL.
EDIT:
Jawaban yang sangat menarik di sini menunjukkan bahwa, untuk indeks dengan banyak membaca dan menulis, membangun kembali mungkin tidak bermanfaat. Dalam kasus saya, ruang yang dikonsumsi adalah masalah, tetapi jika kinerja menulis lebih penting, orang mungkin lebih baik dengan indeks yang lemah.
sumber
VARCHAR
dalam estimasi saya di atas, tetapi tidak untuk jumlah kolom. Tabel ini tidak memiliki bidang NULLable (seharusnya menyebutkan itu), apakah masih mengalokasikan byte untuknya?Apakah tipe data berubah dari waktu ke waktu? Apakah kolom panjang variabel telah dihapus? Apakah indeks telah sering didefragmentasi tetapi tidak pernah dibangun kembali? Apakah banyak baris telah dihapus atau banyak kolom panjang variabel telah diperbarui secara signifikan? Diskusi yang bagus di sini .
sumber
VARCHAR
danDATETIME2
, dalam urutan itu. Sisipan akan didistribusikan secara merata untuk bidang pertama. Untuk bidang kedua, nilai-nilai baru dan akan selalu lebih besar daripada yang ada.