Apakah waktu yang diperlukan untuk membangun kembali indeks tergantung pada tingkat fragmentasi?
Apakah pembangunan kembali indeks terfragmentasi 80% kira-kira memakan waktu 2 menit jika pembangunan kembali indeks yang sama terfragmentasi 40% membutuhkan waktu 1 menit?
Saya meminta RUNTIME (misalnya dalam hitungan detik) yang mungkin diperlukan untuk melakukan tindakan yang diperlukan, bukan tentang tindakan apa yang diperlukan dalam situasi tertentu apa. Saya menyadari praktik terbaik dasar ketika indeks reorg atau membangun kembali / pembaruan statistik harus dilakukan.
Pertanyaan ini TIDAK bertanya tentang REORG dan perbedaan antara REORG dan REBUILD.
Latar belakang: Karena pengaturan pekerjaan pemeliharaan indeks yang berbeda (setiap malam, pekerjaan yang lebih berat di akhir pekan ...) Saya bertanya-tanya apakah pekerjaan pemeliharaan indeks OFFLINE "intens cahaya" harian harus lebih baik dilakukan pada indeks terfragmentasi menengah-rendah untuk menjaga agar off-kali kecil - atau bahkan tidak masalah dan pembangunan kembali pada indeks terfragmentasi 80% mungkin mengambil off-waktu yang sama dengan operasi yang sama pada indeks yang sama 40% terfragmentasi.
Saya mengikuti saran dan mencoba mencari tahu sendiri apa yang sedang terjadi. Pengaturan eksperimental saya: Pada server uji yang melakukan TIDAK ADA yang lain dan tidak digunakan oleh siapa pun atau apa pun, saya membuat tabel dengan Indeks Clustered pada kolom kunci primer pengenal unik dengan beberapa kolom tambahan dan tipe data berbeda [2 angka, 9 datetime, dan 2 varchar (1000)] dan cukup menambahkan baris. Untuk tes yang disajikan saya menambahkan sekitar 305.000 baris.
Kemudian saya menggunakan perintah pembaruan dan secara acak memperbarui berbagai baris pemfilteran pada nilai integer dan mengubah salah satu Kolom VarChar dengan nilai string yang berubah untuk membuat fragmentasi. Setelah itu saya memeriksa avg_fragmentation_in_percent
level saat ini di sys.dm_db_index_physical_stats
. Setiap kali saya membuat fragmentasi "baru" untuk tolok ukur saya, saya menambahkan nilai ini termasuk physical_page_count
nilai ke rekaman saya yang terbuat dari diagram berikut.
Lalu aku Ran: Alter index ... Rebuild with (online=on);
dan meraihnya CPU time
dengan menggunakan STATISTICS TIME ON
rekamanku.
Harapan saya: Saya berharap untuk melihat setidaknya indikasi semacam kurva linier yang menunjukkan ketergantungan antara tingkat fragmentasi dan waktu cpu.
Ini bukan kasusnya. Saya tidak yakin apakah prosedur ini benar-benar sesuai untuk hasil yang baik. Mungkin jumlah baris / halaman terlalu rendah?
Namun hasilnya menunjukkan bahwa jawaban atas pertanyaan awal saya pasti adalah TIDAK . Sepertinya waktu cpu yang diperlukan SQL Server perlu membangun kembali indeks tidak tergantung pada tingkat fragmentasi atau tergantung pada Jumlah Halaman dari indeks yang mendasarinya.
Grafik pertama menunjukkan waktu cpu yang diperlukan untuk MEMBANGUN KEMBALI indeks dibandingkan dengan tingkat fragmentasi sebelumnya. Seperti yang Anda lihat garis rata-rata adalah relatif konstan dan sama sekali tidak ada hubungan antara fragmentasi dan waktu cpu yang diperlukan diamati.
Untuk menghormati pengaruh yang mungkin dari perubahan jumlah halaman dalam indeks setelah pembaruan saya yang dapat membutuhkan lebih banyak atau lebih sedikit waktu untuk membangun kembali, saya menghitung TINGKAT FRAGMENTASI * HALAMAN COUNT dan menggunakan nilai ini pada bagan kedua yang menunjukkan hubungan waktu cpu yang diperlukan vs. fragmentasi dan jumlah halaman.
Seperti yang Anda lihat, ini juga tidak menunjukkan bahwa waktu yang diperlukan untuk membangun kembali dipengaruhi oleh fragmentasi bahkan jika jumlah halaman berbeda.
Setelah membuat pernyataan itu, saya kira prosedur saya pasti salah karena waktu cpu diperlukan untuk membangun kembali indeks yang besar dan sangat terfragmentasi maka mungkin hanya dipengaruhi oleh jumlah baris - dan saya tidak benar-benar percaya pada teori ini.
Jadi, karena saya benar-benar dan pasti ingin mengetahui ini sekarang, komentar dan rekomendasi lebih lanjut sangat disambut .
Untuk semua orang yang tertarik, saya telah membuat grafik yang menunjukkan indeks REBUILD durasi sekitar 2500 indeks membangun kembali dalam beberapa minggu sehubungan dengan fragmentasi indeks dan ukurannya di halaman.
Data ini didasarkan pada 10 Server SQL, kumpulan tabel dan prosedur optimalisasi Ola Hallengren . Ambang umum untuk pembangunan kembali diatur ke fragmentasi 5%.
Saya telah memotong beberapa tabel terbesar (10 Mi + Pages) dalam statistik ini agar lebih mudah dibaca.
Grafik menunjukkan waktu yang diperlukan (durasi) sebagai ukuran gelembung. Nilai-nilai gelembung terbesar adalah sekitar 220 detik. Ini menunjukkan bahwa waktu yang diperlukan untuk membangun kembali indeks tidak benar-benar terkait dengan fragmentasi. Sebaliknya tampaknya lebih tergantung pada jumlah halaman yang dimiliki indeks. Juga itu menunjukkan bahwa fragmentasi tingkat rendah lebih memakan waktu daripada fragmentaion yang lebih tinggi.
Bagan kedua hanya diperbesar ke area <= 200 K Halaman. Ini menunjukkan hal yang sama, butuh lebih lama untuk indeks yang lebih besar, bukan untuk lebih banyak fragmentasi.
sumber
REBUILD
indeks tidak tergantung pada fragmentasi. Ini menjatuhkan indeks sepenuhnya dan membuatnya dari awal.REORGANZE
index - adalah untuk mengurangi fragmentasi tanpa membangun kembali indeks, jadi tidak ada drop dan buat.MS menyarankan menggunakan Reorganisasi untuk fragmentasi 30% atau kurang. Untuk fragmentasi yang lebih tinggi, Rebuild lebih disukai.
Berikut ini adalah artikel MSDN tentang ini: Reorganisasi dan Membangun Kembali Indeks
MEMPERBARUI
Dalam hal waktu yang dibutuhkan untuk menyelesaikan operasi, itu jelas tergantung pada fragmentasi indeks. Membangun kembali indeks yang sangat terfragmentasi akan memakan waktu kurang dari pengorganisasian kembali; membangun kembali indeks yang sedikit terfragmentasi akan memakan waktu lebih lama. Saya akan menyarankan mengambil pedoman MS sebagai titik awal dan menjalankan beberapa tes pada tabel Anda. Titik impas dalam hal fragmentasi% akan tergantung pada tabel tertentu, ukuran indeks dan jenis data.
sumber
Algoritma untuk REBUILD vs REORG berbeda. REORG TIDAK akan mengalokasikan luasan baru sebagai kebalikan dari REBUILD. REORG akan bekerja dengan halaman yang dialokasikan saat ini (mengalokasikan satu halaman acak 8Kb sehingga dapat memindahkan halaman di sekitar) dan memindahkannya ke sekitar dan kemudian membatalkan alokasi halaman jika diperlukan.
Dari catatan internal SQLSkills saya (sebelumnya IE0) ....
Untuk REBUILD:
Untuk Indeks REORG:
Baca terus - Catatan - Fragmentasi, Jenis dan Solusi Indeks SQL Server
sumber
Saya tahu ini adalah utas lama, tetapi saya pikir akan bermanfaat untuk membagikan pos Paul Randal di sini.
https://www.sqlskills.com/blogs/paul/sqlskills-sql101-rebuild-vs-reorganize/
sumber
Ya, karena biasanya sebuah pembangunan kembali perlu memindai indeks asli agar sementara streaming baris (dalam urutan) ke partisi indeks fisik baru. Fragmentasi menyakitkan pemindaian yang tidak diikat, jadi ya pembangunan kembali akan memakan waktu lebih lama.
Berapa lama lagi tergantung pada fragmentasi dan pada bagaimana CPU mengikat seluruh proses. Baris serialisasi adalah CPU yang cukup intensif sehingga mungkin tidak masalah sama sekali. Atau, Anda mungkin mendapatkan tingkat IO acak dari biasanya 1,5MB / detik yang dengan mudah 5-10x lebih lambat dari pembangunan kembali cepat akan (tergantung pada skema dan data). Bergantung pada asumsi yang Anda buat, Anda mungkin dapat merancang apa pun antara penurunan 1x dan 100x.
Itu bukan hubungan linear. Metrik fragmentasi adalah proksi yang sangat kasar untuk berapa lama waktu yang diperlukan untuk memindai partisi.
sumber
CHECKPOINT; DBCC DROPCLEANBUFFERS
sebelum setiap tes. Saya tertarik melihat hasilnya juga. Saya pernah melakukan tes serupa di mana saya mengukur kecepatan pemindaian tergantung pada fragmentasi tetapi saya tidak ingat hasilnya.