Apakah indeks waktu bangun kembali tergantung pada tingkat fragmentasi?

8

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_percentlevel 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_countnilai ke rekaman saya yang terbuat dari diagram berikut.

Lalu aku Ran: Alter index ... Rebuild with (online=on); dan meraihnya CPU timedengan menggunakan STATISTICS TIME ONrekamanku.

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.

Indeks Fragmentasi & Membangun Kembali Statistik Waktu CPU

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 .

Magier
sumber

Jawaban:

2

Apakah waktu yang diperlukan untuk membangun kembali indeks tergantung pada tingkat fragmentasi?

Saya percaya ini tidak akan menjadi parameter utama di mana SQL server akan memutuskan dan membutuhkan waktu untuk membangun kembali \ mengatur ulang indeks:

Ada berbagai faktor lain yang terlibat berdasarkan "DATA" di mana ia memutuskan berapa lama waktu yang dibutuhkan: Parameter suka

Faktor 1: Ukuran tabel

Faktor 2: Masalah yang ada

Faktor 3: Partisi

Faktor 4: Indeks kolom dan keunikan

Jika Anda ingin membaca lebih lanjut tentang faktor-faktor ini, Anda dapat merujuk di sini .

Apakah pembangunan kembali indeks terfragmentasi 80% kira-kira memakan waktu 2 menit jika pembangunan kembali indeks yang sama terfragmentasi 40% membutuhkan 1 menit

Sekali lagi jawabannya bisa itu Tergantung! Untuk angka-angka Anda perlu menguji skenario dan melihat output bagaimana kelanjutannya. Lacak perincian seperti seperti untuk FRAG level 80, rekondisi mengambil X jam \ menit \ dtk dan untuk Frag level 40, rekondisi mengambil Y jam \ menit \ dtk. Hitung dan pertahankan riwayatnya selama 15 hari, (tergantung pada aktivitas pemeliharaan yang dijadwalkan) dan Anda dapat mengambil kesimpulan tentang berapa banyak waktu yang dibutuhkan untuk membandingkan keduanya.

Selain itu:

Anda dapat mengumpulkan data \ perhitungan pada indeks membangun kembali kemajuan:

baik menggunakan sys.dm_exec_requests DMV OR

Jika Anda memiliki rencana Pemeliharaan Ola untuk Pengindeksan Ulang-Pengorganisasian Ulang, ada opsi untuk menyimpan riwayat tindakan yang dilakukan selama pemeliharaan dalam tabel CommandLog seperti yang dijelaskan dalam SQL Server Index dan Statistik Maintenance . Setelah data disimpan, Anda dapat menanyakan jenis perintah `ALTER_INDEX - REBUILD 'dan perbedaan untuk yang sama antara kolom MULAI WAKTU dan WAKTU AKHIR

KASQLDBA
sumber
@KASQLDBA Saya masuk ke statistik / log Tabel CommandLog Ola. Durasi ini sangat sangat acak dan tidak ada hubungan dengan tingkat fragmentasi yang dapat dikenali. Karena saya memiliki nilai-nilai itu hanya pada lingkungan produksi waktu yang diperlukan untuk membangun kembali mungkin banyak dipengaruhi oleh proses lain sehingga ini sepertinya tidak memberikan jawaban umum.
Magier
8

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. Indeks Durasi Pembangunan Kembali

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. masukkan deskripsi gambar di sini

Magier
sumber
6

REBUILDindeks 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.

Stoleg
sumber
4

Apakah pembangunan kembali indeks terfragmentasi 80% kira-kira memakan waktu 2 menit jika pembangunan kembali indeks yang sama terfragmentasi 40% membutuhkan waktu 1 menit?

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:

  • Ini dapat menggunakan banyak CPU - dapat memanfaatkan paralelisme untuk melakukan pekerjaan dengan cepat.
  • Untuk indeks yang sangat terfragmentasi (misalnya 80% seperti pada contoh Anda), REBUILD akan jauh lebih cepat daripada REORG. REBUILD hanya akan membuat salinan lain dari indeks vs REORG akan terhenti dalam menghapus fragmentasi dan karenanya akan lebih lambat. Ini adalah alasan bahwa Paul Randal memberikan rekomendasi umum bahwa akan baik untuk melakukan REBUILD dari indeks yang sangat terfragmentasi.
  • REBUILD akan memungkinkan Anda untuk mengubah mode pemulihan ke BULK_LOGGED untuk penebangan minimal di sana dengan menghasilkan lebih sedikit catatan log .

Untuk Indeks REORG:

  • Selalu ada utas tunggal. Tidak ada paralelisme.
  • Ini lebih lambat untuk indeks sangat terfragmentasi dan lebih cepat untuk indeks terfragmentasi ringan. Biaya membuat indeks vs melakukan reorg indeks terfragmentasi ringan lebih dan karenanya REORG akan lebih cepat untuk indeks terfragmentasi ringan.
  • REORG selalu sepenuhnya operasi log.

Baca terus - Catatan - Fragmentasi, Jenis dan Solusi Indeks SQL Server

Kin Shah
sumber
Kin, TY atas komentar Anda, tetapi saya merasa Anda telah mengawasi Inti dari pertanyaan saya. Anda membandingkan reorg vs membangun kembali. Saya bertanya tentang perbandingan membangun kembali vs Membangun kembali untuk Tingkat fragmentasi yang berbeda (ceteris paribus).
Magier
@ Majer jika Anda membaca kembali jawaban saya dengan hati-hati, itu menjawab pertanyaan inti Anda - jika indeks sangat terfragmentasi, buat kembali. Biaya melakukan pembangunan kembali yang terfragmentasi ringan jauh lebih banyak daripada melakukan reorg. Juga, tidak ada cara yang benar atau salah dalam mengatasi fragmentasi dengan melakukan pembangunan kembali atau reorg, semuanya tergantung pada ketersediaan sistem Anda, data, ukuran indeks, subsistem IO disk, dll. Anda juga dapat dengan mudah memutar beberapa tes sesuai lingkungan Anda untuk membandingkan pembangunan kembali vs Membangun kembali untuk Tingkat fragmentasi yang berbeda. Tidak bisa Anda
Kin Shah
Saya tidak pernah bertanya atau menyebutkan tentang REORG. Ini semua tentang REBUILD. Dan, ya, tentu saja saya dapat melakukan tes dan mencoba membuat level fragmentasi khusus untuk mengetahui berapa lama waktu yang dibutuhkan untuk membangun kembali, tetapi saya ingin melihat apakah ada yang tahu dan bisa memberi tahu saya hasil yang diharapkan dari pendekatan itu.
Magier
3

Saya tahu ini adalah utas lama, tetapi saya pikir akan bermanfaat untuk membagikan pos Paul Randal di sini.

Kecepatan Algoritma

Membangun kembali indeks akan selalu membangun indeks baru, bahkan jika tidak ada fragmentasi. Lamanya waktu yang dibutuhkan untuk membangun kembali terkait dengan ukuran indeks, bukan jumlah fragmentasi di dalamnya.

https://www.sqlskills.com/blogs/paul/sqlskills-sql101-rebuild-vs-reorganize/

Elvin Ahmadov
sumber
0

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.

Apakah pembangunan kembali indeks terfragmentasi 80% kira-kira memakan waktu 2 menit jika pembangunan kembali indeks yang sama terfragmentasi 40% membutuhkan waktu 1 menit?

Itu bukan hubungan linear. Metrik fragmentasi adalah proksi yang sangat kasar untuk berapa lama waktu yang diperlukan untuk memindai partisi.

usr
sumber
@Magier penelitian yang bagus. Waktu CPU tidak pernah terpengaruh oleh fragmentasi. Anda menguji tabel kecil yang sepenuhnya di-cache dalam memori sehingga tidak ada membaca IO sama sekali. Tes tidak valid. Uji dengan tabel yang lebih besar (seperti 100MB) dan lakukan CHECKPOINT; DBCC DROPCLEANBUFFERSsebelum 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.
usr
Perlu diketahui juga bahwa nomor fragmentasi adalah semacam indikator yang longgar karena yang benar-benar diperhitungkan adalah gerakan kepala disk fisik. Saya bisa membayangkan banyak pola IO yang cukup cepat tetapi memiliki fragmentasi 100% yang diukur oleh SQL Server menggunakan definisi yang sempit. Misalnya pola alokasi 1_2_3_4 di mana 1-4 dipindai dan _ adalah lubang harus cepat.
usr
nilai apa sebenarnya yang harus saya perhatikan saat itu? Saya benar-benar mendapatkan informasi berikut dari Rebuild: Waktu CPU = 0 ms, waktu yang berlalu = 70 ms. Tabel 'tFrag2'. Pindai hitungan 4, pembacaan logis 512067, pembacaan fisik 26, pembacaan pembacaan 71209, pembacaan logis lob 0, pembacaan fisik lob 0, pembacaan pembacaan lob 0 0. Waktu Eksekusi Server SQL: Waktu CPU = 8657 ms, waktu yang berlalu = 27246 MS. Waktu Eksekusi SQL Server: Waktu CPU = 8657 ms, waktu yang berlalu = 27386 ms.
Majus
Apakah kali ini dari 3 pertanyaan? Agak membingungkan. Anda dapat mengetahui dari angka pertama bahwa banyak data di-cache. 70ms juga terlalu pendek untuk patokan yang valid. Bisakah Anda menjelaskan apa yang angka-angka itu wakili?
usr
Waktu yang saya sebutkan berasal dari STATISTICS_TIME dan STATISTICS_IO. Saya akan memulai kembali patokan baru sekarang dan kali ini saya ingin mendapatkan hasil yang tepat. Jadi saran lebih lanjut sangat disambut. Saya tidak mengerti apa pembersihan cache data membantu karena saya perhatikan tertarik untuk mendapatkan kembali data dengan cepat tetapi membangun kembali indeks, apa, afaik, yang harus dilakukan pada disk anyways?
Magier