Tüm eski sorgu planlarını Microsoft SQL Server içinden nasıl temizlersiniz?


12

Microsoft SQL veritabanı kullanan hazır bir uygulamamız var. Bu uygulamada her rapor için çeşitli seçim kriterlerini seçip seçiyoruz. Bu uygulama daha sonra bu raporları çalıştırır.

Bir sorgu planı sorunumuz olduğuna inanıyorum. Her gün yayınladığımız ilk rapor 7 dakika çok hızlı çalışıyor. İlk rapordan sonra çalıştırdığımız raporlar bir saatten fazla sürer.

Her gece SQL Server Agent ve SQL Server'ı durduran ve başlatan zamanlanmış bir görev çalıştırıyoruz. Bu bir SQL Server örneği içinde yaklaşık 25 veritabanı daha vardır. Başka hiçbir veritabanının performans sorunu yoktur, yalnızca daha önce bahsettiğim raf ürününün dışında.

SQL Server'ın şu anda bellekte olan tüm sorgu planlarını temizlemenin bir yolu var mı?

Aynı sunucudaki diğer veritabanlarına güvenen 30 kadar kullanıcıyı etkilemeden bunu nasıl yapabilirim?


Yanıtlar:


7

Önceki cevabım için özür dilerim.

1) Sorgunuzun depolanan yordamdan her çalıştırıldığında değişeceğini biliyorsanız, WITH RECOMPILE seçeneğini CREATE PROCEDURE deyimine ekleyin. WITH RECOMPILE seçeneği saklı yordam yürütme planının yeniden kullanılmasını önler, bu nedenle SQL Server bu yordam için bir planı önbelleğe almaz ve yordam çalışma zamanında yeniden derlenir. WITH RECOMPILE seçeneğini kullanmak, sorgunuz saklı yordamdan her çalıştırıldığında değişecekse performansı artırabilir, çünkü bu durumda yanlış yürütme planı kullanılmaz.

2) Yürütme planını zorlamak için her sorgu türü (saklanan yordam istek türü) için USE PLAN sorgu ipucu kullanan bir plan kılavuzu oluşturmanız gerekir .

İşte size yardımcı olabilecek yürütme planı hakkında makale .


RECOMPILE İLE kullanmayı kabul ediyorum, bunu inşa ettiğim sistemlerle yaptım. Ancak, sql kaynağına erişimim yok ... bir uygulama içinden çalışır.
Michael Riley - AKA Gunny

@Cape Cod Gunny bu durumda deneyin DBCC FLUSHPROCINDB: SQL Server'ın tamamı değil, belirli bir veritabanı için saklı yordam önbelleğini temizlemek için kullanılır. Daha önce saklı yordam planlarının sınama sonuçlarını olumsuz etkilemediğinden emin olmak için sınamadan önce bu komutu kullanmak isteyebilirsiniz. Örnek: DECLARE @intDBID INTEGER SET @intDBID = (master.dbo.sysdatabases'DEN dbid'i SEÇİN WHERE name = 'database_name') DBCC FLUSHPROCINDB (@intDBID)
garik

Sorun çözüldü. Arama kriterlerini saklamak için kullanılan bir geçici tablonun sürekli veri biriktirdiği ortaya çıktı. İşlemin, verileri toplamadan önce bu tablodaki verileri kısaltması beklenir. Güzel sql snippet'i için teşekkürler.
Michael Riley - AKA Gunny

13

Burada iki soru sordunuz. İlk olarak, bir SQL örneği için bellekte depolanan tüm planları kaldırabileceğinizi bilmek istersiniz. Matt M'nin önerdiği gibi bu DBCC FREEPROCCACHE ile yapılır.

Sorduğunuz ikinci soru, "Aynı sunucudaki diğer veritabanlarına güvenen 30 kadar kullanıcıyı etkilemeden bunu nasıl yapabilirim?". Kısa cevap "yapamazsın". Tüm planları kaldırırsanız, bellekte olan planlara dayanan diğer kullanıcılardan daha büyük bir performans düşüşü yaşayabilirsiniz.

Bunun çözümü, bazı manuel müdahaleleri gerektirir. Plan_handle'a sahip olmanız koşuluyla belirli planları kaldırmak için DBCC FREEPROCCACHE kullanabilirsiniz.

Yukarıda açıkladığınızdan, bir plan sorunu gibi geliyor, ancak planların kaldırılmasının cevap olduğundan emin değilim. Planları kaldırma hakkında düşünmeden önce size parametre koklama yönünde işaret ederim:

http://blogs.msdn.com/b/conor_cunningham_msft/archive/2010/08/11/conor-vs-misbehaving-parameterized-queries-optimize-for-hints.aspx

DBCC FREEPROCCACHE ile planlı bir şekilde dalga geçmektense sorguları optimize edebilmelisiniz. Ayrıca vakanızın bekleme olaylarını analiz etmek için zaman harcamanızı tavsiye ederim.


DBCC FREEPROCCACHE sorunu çözmedi. Etkinliği ve olayları izliyorum. 0 fiziksel G / Ç vardır. Net Sql İstemci Veri Sağlayıcısı: Bu uygulama üzerinde asılı gibi görünüyor. Bekleme türü CXPACKET'tir.
Michael Riley - AKA Gunny

CXPACKET, sorgunuzun paralel gittiği anlamına gelir. Sorgu için kaç iş parçacığının çalıştığını belirleyebilir ve beklemelerini inceleyebilir misiniz? Adam Machanic'in ücretsiz aracını WhoIsActive sqlblog.com/files/folders/release/entry29675.aspx kullanmak isteyebilirsiniz .
SQLRockstar

7

DBCC FREEPROCCACHE

Bu komutu kullanarak, prosedür önbelleğinin tamamını tek bir komuta kadar temizleyebilirsiniz. Bu komutu kullanmadan önce mutlaka belgeleri okuyun. Açıklamalar bölümünü birkaç kez okuyun.

Yordam önbelleğinin temizlenmesi, saklı yordam önbelleklerinin sonraki kullanımda yeniden derlenmesine neden olur. Bu performansı etkileyebilir. Dikkatli kullanın!

Mat


DBCC FREEPROCCACHE kullanmayı denedim ve sorunu çözmedi. 1 saat sonra süreci öldürdüm.
Michael Riley - AKA Gunny
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.