IndexOptimize'dan sonra sorgular ve güncellemeler son derece yavaş


12

Veritabanı SQL Server 2017 Enterprise CU16 14.0.3076.1

Kısa bir süre önce varsayılan İndeks Yenileme bakım işlerinden Ola Hallengren'e geçmeyi denedik IndexOptimize. Varsayılan Dizin Yeniden Oluşturma işleri birkaç ay boyunca sorunsuz bir şekilde çalışıyordu ve sorgular ve güncellemeler kabul edilebilir yürütme süreleriyle çalışıyordu. IndexOptimizeVeritabanında çalıştırdıktan sonra :

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'

performans çok düştü. Daha önce 100 ms süren bir güncelleme ifadesi IndexOptimizedaha sonra 78.000 ms sürdü (özdeş bir plan kullanarak) ve sorgular aynı zamanda birkaç büyüklük daha da kötüye gitti.

Bu hala bir test veritabanı olduğundan (Oracle'dan bir üretim sistemi geçiriyoruz) bir yedeklemeye geri döndük ve devre dışı bıraktık IndexOptimizeve her şey normale döndü.

Ancak üretime geçtikten sonra bundan kaçındığımızdan emin olmak için bu aşırı performans bozulmasına neden olabilecek IndexOptimize"normal" den farklı olanı anlamak Index Rebuildistiyoruz. Ne aramak için herhangi bir öneri büyük mutluluk duyacağız.

Güncelleme deyimi yavaş olduğunda yürütme planı. ie
IndexOptimize Gerçek yürütme planından sonra (en kısa sürede
geliyor)

Bir fark bulamadım.
Hızlı olduğunda aynı sorguyu planlayın
Gerçek yürütme planı

Yanıtlar:


11

İki bakım yaklaşımınız arasında tanımlanmış farklı bir örnekleme oranınız olduğundan şüpheleniyorum . Şu anda yaptığınız gibi görünmeyen @StatisticsSampleparametreyi belirtmedikçe Ola'nın komut dosyalarının varsayılan örneklemeyi kullandığına inanıyorum .

Bu noktada, bu bir spekülasyon, ancak veritabanınızda aşağıdaki sorguyu çalıştırarak istatistiklerinizde şu anda hangi örnekleme oranının kullanıldığını kontrol edebilirsiniz:

SELECT  OBJECT_SCHEMA_NAME(st.object_id) + '.' + OBJECT_NAME(st.object_id) AS TableName
    ,   col.name AS ColumnName
    ,   st.name AS StatsName
    ,   sp.last_updated
    ,   sp.rows_sampled
    ,   sp.rows
    ,   (1.0*sp.rows_sampled)/(1.0*sp.rows) AS sample_pct
FROM sys.stats st 
    INNER JOIN sys.stats_columns st_col
        ON st.object_id = st_col.object_id
        AND st.stats_id = st_col.stats_id
    INNER JOIN sys.columns col
        ON st_col.object_id = col.object_id
        AND st_col.column_id = col.column_id
    CROSS APPLY sys.dm_db_stats_properties (st.object_id, st.stats_id) sp
ORDER BY 1, 2

Bunun 1'lerden (örneğin% 100) geldiğini görüyorsanız, bu sizin sorununuzdur. Belki Ola'nın komut dosyalarını @StatisticsSample, bu sorgu tarafından döndürülen yüzdeyle birlikte parametre de dahil olmak üzere tekrar deneyin ve bunun sorununuzu çözüp çözmediğine bakın?


Bu teori için ek destekleyici kanıt olarak, yürütme planı XML'si yavaş sorgu için oldukça farklı örnekleme oranları gösterir (% 2.18233):

<StatisticsInfo LastUpdate="2019-09-01T01:07:46.04" ModificationCount="0" 
    SamplingPercent="2.18233" Statistics="[INDX_UPP_4]" Table="[UPPDRAG]" 
    Schema="[SVALA]" Database="[ulek-sva]" />

Hızlı sorguya (% 100) karşı:

<StatisticsInfo LastUpdate="2019-08-25T23:01:05.52" ModificationCount="555" 
    SamplingPercent="100" Statistics="[INDX_UPP_4]" Table="[UPPDRAG]" 
    Schema="[SVALA]" Database="[ulek-sva]" />

@JoshDarnell LOL, bu, göremediğim sorgu planında bazı destekleyici istatistik bilgileri bulduğunuz ikinci durum . Düzenleme için teşekkürler!
John Eisbrener

Haha bunu sen unuttum, John! Söz veriyorum seni takip etmiyorum
Josh

@JoshDarnell Ek içgörüleri takdir ediyorum ve yürütme planlarında atlanmaması gereken çok fazla bilgi olduğu başka bir iyi hatırlatma.
John Eisbrener

Yardımcı olduğuma sevindim! Ve evet, her zaman özlediğim şeyler de var (İstatistikler tarafından yakıldım, bu yüzden ne olduğunu görmek için hızlı bir şekilde oraya gitme eğilimindeyim).
Josh Darnell

Bu açıklama için teşekkür ederim, gerçekten sorun buydu. İstatistiklerin çoğunun varsayılan örnekleme oranı% 2,2'dir, ancak Oracle'dan geçişten sonra oluşturulan örneklerin birçoğunun örnekleme oranı% 100'dür. Varsayılan dizin yeniden oluşturma 100% tuttu gibi görünüyor ama IndexOptimize kullandığımızda bu da% 2.2 varsayılan uygulandı. @StatisticsSample parametresini uygulamak ve sorguları yeniden çalıştırmak, soruna neden olan şeyin bu olduğunu doğruladı.
Martin Bergström

5

John'un cevabı doğru çözümdür, bu sadece yürütme planının hangi bölümlerinin değiştiğine ve Sentry One Plan explorer ile farkların nasıl kolayca tespit edileceğine bir eklentidir.

IndexOptimize'dan 100ms önce geçen bir güncelleme bildirimi daha sonra 78.000ms aldı (aynı planı kullanarak)

Performansınızın düştüğü tüm sorgu planlarına bakarken, farkları kolayca tespit edebilirsiniz.

Düşük performans

resim açıklamasını buraya girin

İşlemci süresi ve geçen sürenin 35 saniyesinin üzerinde iki sayım

Beklenen performans

resim açıklamasını buraya girin

Çok daha iyi

Ana bozulma bu güncelleştirme sorgusunda iki kez olur:

UPDATE SVALA.INGÅENDEANALYS
                           SET 
                              UPPDRAGAVSLUTAT = @NEW$AVSLUTAT
                        WHERE INGÅENDEANALYS.ID IN 
                           (
                              SELECT IA.ID
                              FROM 
                                 SVALA.INGÅENDEANALYS  AS IA 
                                    JOIN SVALA.INGÅENDEANALYSX  AS IAX 
                                    ON IAX.INGÅENDEANALYS = IA.ID 
                                    JOIN SVALA.ANALYSMATERIAL  AS AM 
                                    ON AM.ID = IA.ANALYSMATERIALID 
                                    JOIN SVALA.ANALYSMATERIALX  AS AMX 
                                    ON AMX.ANALYSMATERIAL = AM.ID 
                                    JOIN SVALA.INSÄNTMATERIAL  AS IM 
                                    ON IM.ID = AM.INSÄNTMATERIALID 
                                    JOIN SVALA.INSÄNTMATERIALX  AS IMX 
                                    ON IMX.INSÄNTMATERIAL = IM.ID
                              WHERE IM.UPPDRAGSID = SVALA.PKGSVALA$STRIPVERSION(@NEW$ID)
                      )

düşük performans gösteren bu sorgu için yürütme planı

Bu güncelleştirme sorgusunun tahmini sorgu planı performans düştüğünde çok yüksek tahminlere sahiptir:

resim açıklamasını buraya girin

Gerçekte (gerçek yürütme planı), tahminlerin gösterdiği çılgın miktar değil, yine de iş yapmak zorundadır.

Performans üzerindeki en büyük etki, aşağıdaki iki tarama ve karma eşleştirme birleşimidir:

Düşük performansta gerçek tarama # 1

resim açıklamasını buraya girin

Düşük performansta gerçek tarama # 2

resim açıklamasını buraya girin


Beklenen performansa sahip bu sorgu için yürütme planı

Bunu, normal beklenen performansa sahip sorgu planının tahminleri (veya gerçek değerleri) ile karşılaştırdığınızda, farkların fark edilmesi kolaydır.

resim açıklamasını buraya girin

Ayrıca, önceki iki tablo erişimi bile gerçekleşmedi:

resim açıklamasını buraya girin

resim açıklamasını buraya girin

resim açıklamasını buraya girin

İlk olarak build (top) girişi karma tablosuna eklendiğinden, karma birleştirmesinde bu elemeyi göremezsiniz. Daha sonra sıfır değerlerini döndüren bu karma tabloda sıfır değerleri incelenir.


1
Planların ayrıntılı açıklaması için teşekkür ederim, sorunun neden oluştuğunu anlamam çok yardımcı oldu. Sentry One Plan Explorer'a kesinlikle bir göz atacağım, çok kullanışlı görünüyor!
Martin Bergström

@ MartinBergström Bunu duymak güzel, sorgu planlarını sağladığınız ve yorumlarda sorduğumuz tüm ilgili bilgileri bize sağladığınız için teşekkür ederiz :). Plan gezgini ile ilgili en iyi şey ücretsiz olmasıdır! Ayrıca ssms içinden de çalışabilir (yürütme planına sağ tıklayıp "sentryone plan explorer ile görüntüle" ye basarak).
Randi Vertongen

1

Daha fazla bilgi olmadan, karanlıkta sadece hafifçe bilgilendirilmiş bıçaklar alabiliriz, bu yüzden biraz daha fazla sağlamak için soruyu düzenlemeniz gerekir. Örneğin, dizin bakım işlemlerinden önce ve sonra zamanlamaları verdiğiniz söz konusu güncelleme deyiminin sorgu planları, planların güncellendiği dizin istatistikleri nedeniyle farklılık gösterebileceğinden ( https://www.brentozar.com/pastetheplan) / soruyu büyük bir XML parçası ile doldurmak veya planın metninin içerdiği ilgili bilgilerin bir kısmını içermeyen bir ekran görüntüsü vermek yerine bunun için yararlıdır).

Ama yarasadan iki çok basit nokta:

  1. Optimizasyon çalışması kesinlikle tamamlandı mı? Testleriniz, zamanlamaları etkileyecek uzun süredir devam eden endeks yeniden oluşturmalarının ES'si ile rekabet ediyorsa.
  2. Birden fazla kez test yaptınız mı? Güncelleme, çok fazla veri dikkate alan bir sorgudan elde edilen verilere dayanıyorsa (basit bir `` UPDATE TheTable SET ThisColumn = 'A Static Value' yerine), bu verilerin normalde bellekte olduğu, ancak ilgili sorguların ilk çalıştırmaları, bellekte arabellek havuzunda gerekli olan sayfaları bulmak yerine diske vurma nedeniyle normalden daha yavaş olacaktır .

Yanıtlamak için zaman ayırdığınız için teşekkür ederiz. Sorunu geçmiş plan bağlantıları ile güncelledim. Optimizasyon kesinlikle tamamlanmıştı, sorunların ortaya çıkmasından bir gün önce yaklaşık 1 saat çalıştı. Birden çok kez test yaptık ve aslında iki farklı test ortamında aynı şekilde çalışan veritabanının iki kopyasını etkiledi. Güncelleme ifadesi bulduğum en basit örnekti, etkilenen çok sayıda ek ve seçim vardı
Martin Bergström

"Birden çok kez" ile ben endeks optimizasyon betiği birden çok kez bağımsız olarak çalıştırmak yerine (bu kendisi sonuç tekrarlanabilir olduğunu doğrulamak için yararlı bir yol olsa da) endeks bir örneği sonra güncellemeleri birden çok kez denemek anlamına geliyordu. Bellek temizleme sorunu ise (veya bir parçasıysa), ilk seçimlerden gelen güncellemeler arabellek havuzunu kullanıma hazırlar, böylece daha sonraki olanlar önemli ölçüde azaltılmış G / Ç nedeniyle potansiyel olarak daha hızlı olur.
David Spillett

Cevabım net değilse özür dilerim. Evet, güncellemeleri birkaç kez denedik. Yavaşlamalar, test kullanıcıları tarafından uygulamayı test etmek için kullanılan bir veritabanında ve gün içinde performans artışı olmadan birden çok kez çalıştırılan sorgu ve güncelleştirmelerde meydana geldi.
Martin Bergström
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.