İyileştirilmiş iç içe döngü veya toplu sıralama kullanan sorgularda yüksek CPU veya bellek yetki vermeleri oluşabilir

Bu makale, SQL Server'de sorgu çalıştırdığınızda yüksek CPU kullanımının oluşması sorununu çözmenize yardımcı olur.

Şunlar için geçerlidir: SQL Server
Özgün KB numarası: 2009160

Belirtiler

Son derece eşzamanlı bir iş yüküne sahip microsoft SQL Server çalıştırırken sorgularda bazı performans sorunlarıyla karşılaşabilirsiniz. Bu davranış orta ve yüksek CPU kullanımı veya aşırı bellek verme istekleri olarak gösterilebilir.

Ayrıca OOM koşulları, plan önbelleği çıkarma için bellek baskısı veya beklenmeyen RESOURCE_SEMAPHORE beklemeler gibi diğer yan etkilerle karşılaşabilirsiniz.

Ayrıca, çok fazla CPU veya bellek kullanan sorgular için sorgu planlarının İç İçe Döngüler birleştirme işleci için OPTIMIZED özniteliğinin True olarak ayarlandığını fark edebilirsiniz.

Neden

Bu sorun, SQL Server sorgu işlemcinin performansı geliştirmek için isteğe bağlı bir sıralama işlemine neden olduğu bazı durumlarda oluşabilir. Bu işlem "İyileştirilmiş İç İçe Döngü" veya "Batch Sort" olarak bilinir ve sorgu iyileştiricisi bu işleçlerin en iyi şekilde tanıtılması gereken zamanları belirler. Nadir durumlarda, sorgu yalnızca birkaç satıra dokunur, ancak sıralama işleminin kurulum maliyeti o kadar önemlidir ki iyileştirilmiş iç içe döngünün maliyeti avantajlarından daha ağır basar. Bu nedenle, bu durumlarda beklenen performansla karşılaştırıldığında daha yavaş performans gözlemleyebilirsiniz.

Çözüm

İzleme bayrağı 2340

Sorunu düzeltmek için izleme bayrağı 2340'ı kullanarak iyileştirmeyi devre dışı bırakın. İzleme bayrağı 2340, sorgu işlemcisine sorgu planı oluştururken iyileştirilmiş iç içe döngü birleşimleri için sıralama işlemi (toplu sıralama) kullanmamasını ister. Bu durum tüm örneği etkiler.

Bu izleme bayrağını etkinleştirmeden önce, bu iyileştirmeyi devre dışı bırakırken beklenen performans avantajlarını elde ettiğinizden emin olmak için uygulamalarınızı kapsamlı bir şekilde test edebilirsiniz. Bunun nedeni, plan tarafından dokunulan satır sayısında büyük bir artış olduğunda sıralama iyileştirmesinin yararlı olmasıdır.

Daha fazla bilgi için bkz. DBCC TRACEON - İzleme Bayrakları (Transact-SQL).

kodu DISABLE_OPTIMIZED_NESTED_LOOP ipucunu kullanacak şekilde değiştirme

Alternatif olarak, aşağıdaki sorgu ipucunu uygulayarak DISABLE_OPTIMIZED_NESTED_LOOP sorgu düzeyinde iyileştirmeyi devre dışı bırakın.

SELECT * FROM Person.Address  
WHERE City = 'SEATTLE' AND PostalCode = 98104
OPTION (USE HINT (DISABLE_OPTIMIZED_NESTED_LOOP)); 

Daha fazla bilgi için bkz. DISABLE_OPTIMIZED_NESTED_LOOP.

Daha fazla bilgi

Veritabanı Altyapısı Hizmeti Başlangıç Seçenekleri

Uygulandığı öğe

  • SQL Server 2005 ile SQL Server 2019 arasında