Apa Arti Fragmentasi Berarti dalam Tumpukan
Nilai fragmentasi dalam Heap yang Anda dapatkan dari kolom avg_fragmentation_in_percent
dengan meminta sys.dm_db_index_physical_stats
DMV menyatakan itu
Fragmentasi logis untuk indeks, atau perluasan fragmentasi untuk tumpukan di unit alokasi IN_ROW_DATA.
Lebih jauh BOL yang sama mengatakan itu
Ini adalah persentase luasan tidak beraturan di halaman daun tumpukan. Tingkat out-of-order adalah satu di mana tingkat yang berisi halaman saat ini untuk tumpukan tidak secara fisik tingkat berikutnya setelah tingkat yang berisi halaman sebelumnya.
Jadi Anda dapat melihat itu bukan ruang kosong yang ada di halaman yang dialokasikan untuk Heap tetapi urutan beragam halaman yang menciptakan fragmentasi.
Ini dapat ditunjukkan dengan uji kecil. Mari kita buat Heap Table dan masukkan beberapa record di dalamnya lalu periksa fragmentasi.
create table dbo.HeapTest
(
Id INT not NULL Default (1),
Col1 char(5000) Not null Default ('Heaps Are Cool')
)
SET NOCOUNT ON
Insert into dbo.Heaptest default values
go 50
select index_type_desc,avg_fragmentation_in_percent,fragment_count,
avg_page_space_used_in_percent,record_count
from sys.dm_db_index_physical_stats(db_id(),object_id('dbo.HeapTest','U'),0,default,'detailed')
Jadi tabel Heap dibuat dengan 50 catatan di dalamnya. Di bawah ini adalah apa yang tampak seperti fragmentasi setelah permintaan statistik DMV sys.dm_db_index_physical
Anda dapat melihat avg_fragmentation_in_percent
nilai kolom adalah 33%. Sekarang mari kita lihat bagaimana mengatur halaman. Ini dapat dilakukan dengan menggunakan permintaan tidak berdokumen%%lockres%%
. Kueri akan menjadi
SELECT %%lockres%%, * FROM dbo.HeapTest;
Dan di bawah ini adalah seperti apa output itu. Melampirkan hanya bagian yang relevan saja. Kueri menghasilkan 50 baris karena kami memasukkan 50 baris dalam tabel dbo.HeapTest kami.
Apa yang dikatakannya adalah halaman pertama memiliki ID 197
, halaman berikutnya memiliki ID 242
halaman berikutnya memiliki ID terus menerus sampai kita mencapai ID halaman 264
karena setelah itu kita mendapatkan ID halaman 280
. Jadi lompatan nomor ID halaman inilah yang sebenarnya menyebabkan fragmentasi.
Sekarang jangan sampai membangun kembali heap dan jalankan Perintah lagi untuk melihat fragmentasi dan bagaimana halaman diatur. Kami mendapatkan fragmentasi seperti
Anda dapat melihat fragmentasi sekarang 14%
.
Mari kita lihat nomor halaman yang dialokasikan
Kami hanya memiliki satu lompatan istirahat semua halaman dialokasikan ID halaman secara seri. Karena hanya satu lompatan fragmentasi menurun secara signifikan.
Saya membangun kembali Heap lagi dan sekarang ketika saya memeriksa fragmentasi itu benar-benar hilang. Dan alokasi ID halaman seperti
Mengapa Fragmentasi Meningkat
Sekarang mengenai apa yang bisa menyebabkan fragmentasi naik, kita bisa membenarkannya bahwa ketika halaman dialokasikan ke heap, mereka tidak akan berlanjut, seperti yang Anda lihat di atas apa yang menyebabkan nilai fragmentasi meningkat adalah lompatan dalam ID PAGE yang dialokasikan untuk halaman.
Di bagian belakang kepala Anda juga harus ingat bahwa kata fragmentasi untuk HEAP tidak memiliki arti, bagaimana Anda mendefinisikan fragmentasi untuk sekelompok halaman yang tidak dipesan.
Sangat Khawatir tentang Fragmentasi
Jika Anda benar-benar menghadapi skenario di mana tabel tumpukan terfragmentasi dan memperlambat kueri, akan lebih baik membuat indeks berkerumun di atas meja daripada membangunnya kembali. Alasannya adalah ketika Anda membangun kembali menimbun semua indeks Non Cluster yang mendasarinya juga dibangun kembali menyebabkan proses pembangunan kembali memakan waktu lebih lama, memanfaatkan banyak sumber daya dan membengkak log transaksi. Pada sistem produksi kita selalu berusaha menghindari ini. Paulus membahas hal ini di Bagian Mitos tentang tumpukan .
PS: Tolong jangan gunakan perintah tidak berdokumen pada sistem produksi. Ini hanya untuk demonstrasi.