Saya baru-baru menemukan bahwa satu meja tumpukan memiliki lebih dari 70% fragmentasi. Jadi saya memutuskan untuk melakukan
ALTER TABLE dbo.myTable REBUILD
Cukup lucu, setelah itu saya mengalami fragmentasi 20%. Tidak ada tulisan di meja itu sejak itu. Jadi saya memutuskan untuk melakukan pembangunan kembali.
Setelah ke-2 kalinya, table hat 50% fragmentasi bahkan lebih! Saya benar-benar tidak mengerti bagaimana ini bisa terjadi ...
sql-server
fragmentation
heap
tuxmania
sumber
sumber
Jawaban:
Apa Arti Fragmentasi Berarti dalam Tumpukan
Nilai fragmentasi dalam Heap yang Anda dapatkan dari kolom
avg_fragmentation_in_percent
dengan memintasys.dm_db_index_physical_stats
DMV menyatakan ituLebih jauh BOL yang sama mengatakan itu
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.
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 menjadiDan 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 ID242
halaman berikutnya memiliki ID terus menerus sampai kita mencapai ID halaman264
karena setelah itu kita mendapatkan ID halaman280
. 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.
sumber
Heaptest
dan memberikan hasilnya. Saya yakin Anda mungkin melewatkan sesuatu. Pastikan saja tingkat kompatibilitasnya tidak 80 dalam hal ini fungsi db_id tidak berfungsi