Aracılığıyla paylaş


Yeni Kardinalite Tahmin Aracı'ndaki birleştirme kapsaması varsayımı sorgu performansını düşürür

Bu makale, sorgularınızı yeni kardinalite tahmin aracını kullanarak derlerken SQL Server 2014 ve sonraki sürümlerde oluşabilecek performans sorunlarını çözmenize yardımcı olur.

Özgün ürün sürümü: SQL Server
Özgün KB numarası: 3189675

Belirtiler

Aşağıdaki senaryoyu değerlendirin:

  • SQL Server 2014 veya sonraki bir sürümü kullanıyorsunuz.
  • Birleştirmeleri ve birleştirme dışı filtre koşullarını içeren bir sorgu çalıştırırsınız.
  • Sorguyu derlemek için yeni Kardinalite Tahmini (SQL Server) (Yeni CE) kullanırsınız.

Bu senaryoda sorgu performansında düşüş yaşarsınız.

Sorguyu Eski CE kullanarak derlerseniz bu sorun oluşmaz.

Neden

SQL Server 2014'ten, veritabanı uyumluluk düzeyi 120 ve üzeri için Yeni Kardinalite Tahmin Aracı (Yeni CE) kullanıma sunulmuştur. Yeni CE, farklı işleçler ve önkoşullar için kardinalite tahmininde bulunurken Sorgu İyileştiricisi tarafından kullanılan modeldeki eski CE'den çeşitli varsayımları değiştirir.

Bu değişikliklerden biri birleştirme kapsama varsayımı ile ilgilidir.

Eski CE modeli, kullanıcıların her zaman var olan verileri sorguladığını varsayar. Bu, iki tablo için eş birleşim işlemi içeren bir birleştirme koşulu için birleştirmenin her iki tarafında birleştirilmiş sütunların var olduğu anlamına gelir. Birleştirme tablosuna yönelik ek birleştirme olmayan filtre koşullarının varlığında, Eski CE birleştirme önkoşulları ve birleştirme olmayan filtre önkoşulları için bir bağıntı düzeyi olduğunu varsayar. Bu örtük bağıntı, Basit Kapsama olarak adlandırılır.

Alternatif olarak, Yeni CE bağıntı olarak Temel Kapsama kullanır. Yeni CE modeli, kullanıcıların var olmayan verileri sorgulayabileceğini varsayar. Bu, ayrı tablolardaki filtre koşullarının birbiriyle ilişkilendirilmeyebileceği anlamına gelir. Bu nedenle olasılıkçı bir yaklaşım kullanıyoruz.

Birçok pratik senaryo için Temel Kapsama varsayımının kullanılması daha iyi tahminler oluşturur. Bu da daha verimli sorgu planı seçenekleri oluşturur. Ancak bazı durumlarda Basit Kapsama varsayımını kullanmak daha iyi sonuçlar verebilir. Bu durumda, Eski CE yerine Yeni CE kullandığınızda daha az verimli sorgu planı seçeneğiyle karşılaşabilirsiniz.

Yeni CE ile ilgili sorunları giderme hakkında daha fazla bilgi için bkz . SQL Server 2012 veya önceki sürümlerden 2014 veya sonraki bir sürüme yükseltildikten sonra sorgu performansının düşmesi.

Çözüm

SQL Server 2014 ve sonraki sürümlerinde, SQL Server'ı varsayılan Temel Kapsama varsayımı yerine Basit Kapsama varsayımını kullanmaya zorlamak için izleme bayrağı 9476'yı kullanabilirsiniz. Uygulama sorgusunu değiştirebiliyorsanız, SQL Server 2016 (13.x) SP1'in ardından sorgu ipucunu ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS kullanmak daha iyi bir seçenektir. Daha fazla bilgi için bkz . USE HINT. Örneğin:

SELECT * FROM Table1 t1
JOIN Table2 t2
ON t1.Col1 = t2.Col1
WHERE Col1 = 10
OPTION (USE HINT ('ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS'));

Bu izleme bayrağının etkinleştirilmesi veya sorgu ipucunun kullanılması, aşağıdaki koşullar doğruysa Eski CE modeline tamamen geri dönmek zorunda kalmadan sorgu planı seçimini iyileştirebilir:

  • Birleştirmeler ve birleştirme olmayan filtre koşullarını içeren sorgular için genel performansın düşmesine neden olan en iyi olmayan sorgu planı seçimiyle karşılaşırsınız.
  • "Birleştirme kardinalitesi" tahmininde (yani, önemli ölçüde farklılık gösteren gerçek ve tahmini satır sayısı) önemli bir yanlışlığı doğrulayabilirsiniz.
  • Eski CE kullanarak sorgu derlediğinizde bu yanlışlık mevcut değildir.

Bu izleme bayrağını genel olarak, oturum düzeyinde veya sorgu düzeyinde etkinleştirebilirsiniz.

Not

İzleme bayraklarının yanlış kullanılması iş yükü performansınızı düşürebilir. Daha fazla bilgi için bkz . İpuçları (Transact-SQL) - Sorgu.