SQL Server CTE'yi “Optimizasyon Çiti” olarak Kullanırken Hangi Kurallar Belirlenir?


10

Bir süre önce Brent Ozar, SQL Server ve PostgreSQL arasındaki bazı farkları detaylandıran bir yazı yayınladı:

SQL Server ve PostgreSQL Arasındaki İki Önemli Fark

İlk nokta (“CTE'ler optimizasyon çitleri”) dikkatimi çekti, çünkü sağlanan örnekte SQL Server'ın CTE ve ana sorguyu bir araya getirdiği ve tek bir sorgu olarak optimize ettiği ( PostgreSQL).

Ancak, bu davranış, SQL Server CTE'yi dizinlerin daha iyi kullanılmasına, daha iyi performansa, vb. İzin veren bir optimizasyon çiti olarak gördüğü diğer bloglarda ve eğitim sınıflarında gördüğüm örneklerin aksine görünüyor. Örneğin:

Yıldız Seçmenin Daha İyi Bir Yolu

Yani, SQL Server bir optimizasyon çiti SOMETIMES olarak CTE'yi “onurlandırıyor” gibi görünüyor. SQL Server'ın CTE'yi bir optimizasyon çiti (veya tersi davranış) olarak güvenilir bir şekilde onurlandıracağı bilinen vakaların belirli bir listesini belgeleyen iyi kaynaklar var mı?

Yanıtlar:


10

... SQL Server'ın CTE'yi bir optimizasyon çiti olarak güvenilir bir şekilde onurlandıracağı bilinen vakaların listesi

Böyle bir liste, güvenilirlik garantisi olmaksızın gözlemlenen davranışlara dayanacaktır.

SQL Server sorgu iyileştiricisi hiçbir zaman ortak bir tablo ifadesini kendi başına bir optimizasyon çiti olarak ele almaz , ancak bazı yapıların optimizasyonu açıkça zordur. Yinelemeli CTE'ler bunun iyi bir örneğidir.

CTE'ler görünümlere / satır içi işlevlere / alt sorgulara / türetilmiş tablolara çok benzer şekilde ele alınır ve sorguya satır içine alınır. Gözlemlenen herhangi bir 'çit' davranışı, optimize edicinin bu prensipte geçirgen sınır boyunca optimizasyon yapamamasına veya karar vermemeye karar verir.

Genel olarak, CTE ne kadar basit ve 'ilişkisel' ise, optimize edicinin bitleri hareket ettirme olasılığı o kadar yüksektir.

Optimize edicinin düşünmesine veya onu bir CTE'nin 'sonucunu' gerçekleştirmeye zorlayacak özellikler önerilmiş, ancak henüz uygulanmamıştır:

Bu arada, en yaygın çözüm geçici bir tablo veya tablo değişkeninde ayarlanan ara sonucu açıkça gerçekleştirmektir. Bu açıkça tek bir ifadeyle sınırlı olmayan bir senaryo gerektirir.

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.