Yeterli Plan Bulunmayan Sorgular Bulundu


20

Bir SQL Server 2012 veritabanım var. Reason for early termination of statement optimizationBazı sorgular için değerini fark ettim ve tüm verdi Good Enough Plan Found. Şimdi sorularım:

  1. Tüm olası tipler nelerdir: “İfade optimizasyonunun erken sonlandırılma nedeni”. Bunu msdn'de aradım ama değerlerin tam bir listesini alamadım.
  2. İyi Yeterli Plan Bulundu dışındaki nedenlerden dolayı optimizasyonun sonlandırıldığı tüm sorguları listeleyen bir DMV veya genişletilmiş etkinlik var mı? Olasılıkların tam listesini listelemeyen iki makaleden bahsettim. [Ayrıca, bana veritabanımda farklı sonuç verir].

resim açıklamasını buraya girin


Yanıtlar:


20
  • Bellek Sınırı Aşıldı

    Optimize edici, bellek baskısı nedeniyle daha iyi plan alternatifleri aramayı bırakmak zorunda kaldı. Bunun nedeni araştırılmalı ve düzeltilmeli, ardından sorgu derlemesi tekrar denenmelidir. Döndürülen plan, düşük bellek durumu olmasaydı optimize edicinin seçeceği plan olmayabilir.

  • Zaman aşımı

    Bu sebep çok yanlış anlaşılıyor .

    Sorgu iyileştirici hızlı bir şekilde makul bir plan bulmayı amaçlamaktadır . Mümkün olan en iyi planı bulmak için kapsamlı bir arama yapmaz. Tasarım gereği, optimizasyona gereğinden fazla zaman harcamaktan kaçınır. Bunu sağlamak için çalışan bu özelliklerden biri 'zaman aşımı' (zaman ölçüsü değil).

    Optimize edici, mantıksal sorgunun karmaşıklığına, önemlilik tahminlerine ve şu ana kadar bulunan en ucuz planın tahmini maliyetine (varsa) dayalı olarak bir 'keşif bütçesi' belirler. Daha yüksek kardinaliteye sahip daha karmaşık sorgulara daha yüksek bir bütçe verilir.

    Bu bütçe, arama aşamalarından birinde aşılırsa, aşama sona erer. Bu, tasarımcının ve optimize edicinin normal çalışmasının bir parçasıdır. Daha fazla optimize edici çaba gerektiren sorgular bunu elde eder; yapmayanlar, yapmayanlar.

    'Zaman Aşımı'nı' Yeterli Plan Bulundu 'olarak düşünün.

  • Yeterince İyi Plan Bulundu

    Bu, boş bir sebeple tamamen aynı anlama gelir. 0.909090 ... (1 / 1.1) 'in altında bir maliyetle planların bu şekilde etiketlenmesi tarihsel bir tuhaflıktır. Bu neden ortaya çıktığında hiçbir şey erken durmaz veya başka bir şekilde özel olarak ele alınmaz veya optimize edici kodu içinde farklı değildir.

Bellek Sınırı Dışında Aşıldı, 'erken sonlandırma nedenlerinden' hiçbiri sorgu ayarlama veya performans analizi için çok fazla bir anlam ifade etmez. Genellikle onları görmezden gelirim.

Tavsiye

Gerçek performans metriklerine (geçen süre, CPU / bellek kullanımı, ... bağlamda önemli olan ne olursa olsun) dayalı sorgu ayarlama çabalarını hedefleyin. Bir sorgu amaçlanan amacı için çok yavaşsa, daha hızlı hale getirmek için zaman harcayın. Gerçek performansı ölçün, temel ve geçmişle karşılaştırın ve önemli varyanslarda ayarlama çabasını hedefleyin.

Garantili ve temiz verileri, yararlı istatistikler ve dizinler ve iyi yazılmış, optimize edici dostu sorgular ile uygun bir ilişkisel şemada saklayın.


10

Http://schemas.microsoft.com/sqlserver/2004/07/showplan/showplanxml.xsd adresine (bir yürütme planını xml olarak açtığınızda göreceğiniz bağlantıdır) giderseniz, listelenen üç neden:

  • Zaman aşımı
  • MemoryLimitExceeded
  • GoodEnoughPlanFound

Bahsettiğiniz makaleler bu olayları bulmak için uygun görünüyor, belirli bir sorun mu yaşıyorsunuz? Akılda tutulması gereken tek şey, bu DMV'lerin sunucuda çalıştırılan tüm SQL komutlarını yakalamaması ve sunucu yeniden başlatıldığında sıfırlanmamasıdır. Showplan xml'yi Genişletilmiş Olaylar ile yakalayıp sorgulayabilirsiniz, ancak bana aşırı yüklenmiş gibi görünüyor.

Ben de GoodEnoughPlanFound hakkında çok fazla endişelenmezdim, optimize edici işini iyi yapıyor (hızlı bir şekilde iyi bir plan bulma) oldukça iyi görünüyor.

HTH

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.