Database SQL Server 2017 Enterprise CU16 14.0.3076.1
Kami baru-baru ini mencoba beralih dari pekerjaan pemeliharaan Index Rebuild default ke Ola Hallengren IndexOptimize
. Pekerjaan Rebuild Index default telah berjalan selama beberapa bulan tanpa masalah, dan pertanyaan dan pembaruan bekerja dengan waktu eksekusi yang dapat diterima. Setelah berjalan IndexOptimize
di database:
EXECUTE dbo.IndexOptimize
@Databases = 'USER_DATABASES',
@FragmentationLow = NULL,
@FragmentationMedium = 'INDEX_REORGANIZE,INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationHigh = 'INDEX_REBUILD_ONLINE,INDEX_REBUILD_OFFLINE',
@FragmentationLevel1 = 5,
@FragmentationLevel2 = 30,
@UpdateStatistics = 'ALL',
@OnlyModifiedStatistics = 'Y'
kinerja sangat menurun. Pernyataan pembaruan yang mengambil 100 IndexOptimize
ms sebelum mengambil 78.000 ms sesudahnya (menggunakan rencana yang identik), dan kueri juga melakukan beberapa pesanan yang jauh lebih buruk.
Karena ini masih merupakan basis data pengujian (kami memigrasikan sistem produksi dari Oracle), kami kembali ke cadangan dan dinonaktifkan IndexOptimize
dan semuanya kembali normal.
Namun, kami ingin memahami apa yang IndexOptimize
berbeda dari "normal" Index Rebuild
yang dapat menyebabkan penurunan kinerja yang ekstrem ini untuk memastikan kami menghindarinya begitu kami mulai berproduksi. Setiap saran tentang apa yang harus dicari akan sangat dihargai.
Rencana eksekusi untuk pernyataan pembaruan saat lambat. yaitu
Setelah IndexOptimasi
rencana eksekusi Aktual (segera hadir)
Saya belum dapat menemukan perbedaan.
Rencanakan untuk permintaan yang sama ketika itu adalah rencana eksekusi yang cepat
sumber
Jawaban John adalah solusi yang tepat, ini hanya merupakan tambahan untuk bagian mana dari rencana eksekusi yang diubah dan contoh tentang cara mudah menemukan perbedaan dengan Penjelajah Sentry One Plan
Saat melihat semua paket kueri saat kinerja Anda menurun, Anda dapat dengan mudah menemukan perbedaannya.
Performa yang menurun
Dua hitungan lebih dari 35 detik waktu cpu & waktu berlalu
Performa yang diharapkan
Jauh lebih baik
Degradasi utama adalah dua kali pada permintaan pembaruan ini:
rencana eksekusi untuk permintaan ini dengan kinerja yang menurun
Perkiraan rencana kueri dari kueri pembaruan ini memiliki perkiraan yang sangat tinggi ketika kinerja terdegradasi:
Sementara dalam kenyataannya (rencana eksekusi aktual) masih harus melakukan pekerjaan, hanya saja bukan jumlah gila yang ditampilkan perkiraan.
Dampak terbesar pada kinerja adalah dua pemindaian & hash match yang tergabung di bawah:
Pemindaian aktual pada kinerja terdegradasi # 1
Pemindaian aktual pada kinerja terdegradasi # 2
Paket eksekusi untuk permintaan ini dengan kinerja yang diharapkan
Saat Anda membandingkannya dengan perkiraan (atau aktual) dari rencana kueri dengan kinerja normal yang diharapkan, perbedaannya mudah dikenali.
Juga, dua akses tabel sebelumnya bahkan tidak terjadi:
Anda tidak melihat penghapusan ini pada gabungan hash karena input build (atas) dimasukkan ke tabel hash terlebih dahulu. Setelah itu nilai nol diperiksa dalam tabel hash ini, mengembalikan nilai nol.
sumber
Tanpa informasi lebih lanjut, kami hanya dapat menerima bacokan informasi ringan dalam gelap, jadi Anda harus mengedit pertanyaan untuk memberikan sedikit lebih banyak. Misalnya, kueri merencanakan untuk pernyataan pembaruan yang telah Anda berikan waktunya, baik sebelum dan sesudah operasi pemeliharaan indeks karena rencana mungkin berbeda karena statistik indeks telah diperbarui ( https://www.brentozar.com/pastetheplan Saya berguna untuk ini, daripada mengisi pertanyaan dengan apa yang mungkin merupakan sebagian besar dari XML atau memberikan screen-grab yang tidak termasuk beberapa informasi terkait yang berisi teks dari paket tersebut).
Dua poin yang sangat sederhana dari kelelawar:
sumber