Perilaku data dalam indeks berdasarkan faktor pengisian

14

Katakanlah Anda memiliki database di mana faktor isian default adalah 20. Kapan pun data dimasukkan, apakah hanya membuat halaman diisi hingga 20%?

Dari pemahaman saya, ketika data dimasukkan akan ada sekitar 20% dari data di halaman. Namun, ketika data diperbarui, itu akan meluas hingga lebih dari 20% dari indeks, hingga mengisinya dan menghasilkan pemisahan halaman, bukan?

DForck42
sumber

Jawaban:

16

Fill factor hanya berperan ketika indeks dibuat atau dibangun kembali. Ini adalah jumlah konsumsi untuk indeks halaman tingkat daun yang diisi selama operasi ini. ( lihat catatan di bawah untuk penjelasan lebih lanjut tentang level halaman yang terpengaruh )

Ketika ada perintah DML data ( INSERT, UPDATE, dan / atau DELETE), hal itu akan terjadi pada indeks yang terkena sesuai. Dengan kata lain, jika Anda memiliki halaman yang diisi 20% dan Anda memasukkan data ke halaman itu, halaman tersebut akan berisi lebih dari 20% data (misalkan 35% hanya untuk kepentingan contoh). Lakukan sisipan lain, sekarang halaman diisi 64%. Buat kembali indeks, dan halaman tingkat daun sekarang akan relatif berisi persentase ruang yang Anda tentukan (atau secara implisit nilai default untuk server).

( Catatan , ketika Anda tidak menentukan PAD_INDEXuntuk menjadi ON, faktor pengisian hanya diterapkan ke halaman tingkat daun. Tetapi ketika Anda mengatur PAD_INDEX = ON, faktor pengisian akan diperhitungkan untuk halaman indeks tingkat menengah. Defaultnya adalahOFF )

Alasan untuk menyesuaikan faktor pengisian (alih-alih menggunakan standar 100/0) adalah agar Anda meminimalkan pemisahan halaman saat memasukkan atau memperbarui data. Namun perlu diingat, tidak ada yang gratis. Semakin rendah faktor isian, semakin banyak data ruang yang biasanya digunakan. Jika Anda menyimpan ruang halaman 80% gratis untuk indeks Anda, mereka akan mengkonsumsi ruang disk yang relatif lebih besar, yang dapat menyebabkan lebih banyak membaca.

Dari pemahaman saya, ketika data dimasukkan akan ada sekitar 20% dari data di halaman. Namun, ketika data diperbarui, itu akan meluas hingga lebih dari 20% dari indeks, hingga mengisinya dan menghasilkan pemisahan halaman, bukan?

Ketika data dimasukkan, itu akan dimasukkan ke dalam indeks yang sesuai di halaman yang sesuai. Ini bisa dan kemungkinan besar akan sangat baik menyebabkan konsumsi halaman menjadi lebih tinggi daripada faktor pengisian.

Pemecahan halaman akan terjadi ketika data baru ditambahkan ke halaman indeks lengkap. SQL Server kemudian akan membagi halaman dan kira-kira menempatkan setengah dari data dari halaman penuh menjadi halaman baru. Sekali lagi, faktor pengisian tidak ikut berperan di sini.

Alasan yang sah untuk menurunkan faktor pengisian adalah untuk meminimalkan pemisahan halaman, sehingga meminimalkan fragmentasi halaman indeks.

Thomas Stringer
sumber
3
Ini juga meminimalkan operasi IO yang dibutuhkan untuk menumbuhkan atau mengalokasikan ruang.
JNK
OK, jadi saya salah dengan bagaimana perilaku itu bekerja. Terima kasih atas jawaban yang mendetail!
DForck42
1
@ DForck42 Tidak masalah, senang membantu.
Thomas Stringer
Bisakah kita meringkas ini dengan mengatakan bahwa pengaturan faktor pengisian rendah akan cenderung memperlambat pembacaan (lebih banyak halaman) tetapi memasukkan kecepatan (lebih sedikit pemisahan)?
Jon of All Trades
2
@ Jon: Dengan fragmen indeks fillfactor tinggi dan membaca melambat. Untuk setiap indeks ada pengisi yang optimal - di atasnya dan di bawahnya lambat menulis dan membaca. Optimalitas bergantung pada pola penggunaan (berapa banyak sisipan per hari), pola pemeliharaan (seberapa sering dibangun kembali), data (seberapa unik kuncinya). Indeks non-unik cenderung membutuhkan lebih banyak ruang kosong (fillfactor rendah).
wqw