Aracılığıyla paylaş


Sorgu Deposu için ipuçları ve en iyi uygulamalar

Şunlar için geçerlidir: SQL Server 2022 (16.x) ve sonraki sürümleri Azure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'teki SQL veritabanı

Bu makalede, Sorgu Deposu ipuçlarını kullanmaya yönelik en iyi yöntemler ayrıntılı olarak verilmiştir. Sorgu Deposu ipuçları, uygulama kodunu değiştirmeden sorgu planı şekillerinin şekillendirilmesine olanak tanır.

Sorgu Deposu ipuçları için kullanım örnekleri

Aşağıdaki kullanım örneklerini Sorgu Deposu ipuçları için ideal olarak düşünün. Daha fazla bilgi için bkz. Sorgu Deposu ipuçları ne zaman kullanılır?

Caution

SQL Server Sorgu İyileştiricisi genellikle sorgu için en iyi yürütme planını seçtiğinden, deneyimli geliştiriciler ve veritabanı yöneticileri için son çare olarak yalnızca ipuçlarını kullanmanızı öneririz. Daha fazla bilgi için bkz. Sorgu ipuçları.

Kod değiştirilemediğinde

Sorgu Deposu ipuçlarını kullanmak, uygulama kodunu veya veritabanı nesnelerini değiştirmeden sorguların yürütme planlarını etkilemenizi sağlar. Sorgu ipuçlarını hızlı ve kolay bir şekilde uygulamanıza olanak tanıyan başka bir özellik yoktur.

Kod yeniden dağıtılmadan ayıklama-dönüştürme-yükleme (ETL) iş yüklerinden yararlanmak için sorgu deposu ipuçlarını kullanabilirsiniz. Bu 14 dakikalık videoyla Sorgu Deposu ipuçlarıyla toplu yüklemeyi iyileştirmeyi öğrenin:

Sorgu Deposu ipuçları basit sorgu ayarlama yöntemleridir, ancak bir sorgu sorunlu hale gelirse daha önemli kod değişiklikleriyle ele alınmalıdır. Bir sorguya Sorgu Deposu önerilerini düzenli olarak uygulama gereksinimi duyuyorsanız, daha kapsamlı bir sorgu yeniden yazmayı göz önünde bulundurun. SQL Server Sorgu İyileştiricisi genellikle sorgu için en iyi yürütme planını seçer. Deneyimli geliştiriciler ve veritabanı yöneticileri için ipuçlarını yalnızca son çare olarak kullanmanızı öneririz.

Hangi sorgu ipuçlarının uygulanabileceği hakkında bilgi için bkz. Desteklenen sorgu ipuçları.

Yüksek işlem yükü altında veya görev açısından kritik kod söz konusu olduğunda

Yüksek çalışma süresi gereksinimleri veya işlem yükü nedeniyle kod değişiklikleri pratik değilse, Sorgu Deposu ipuçları mevcut sorgu iş yüklerine hızlı bir şekilde sorgu ipuçları uygulayabilir. Sorgu Deposu ipuçlarını eklemek ve kaldırmak kolaydır.

Sorgu Deposu ipuçları, olağanüstü iş yükü artışları için zaman dilimleri boyunca performansı ayarlamak amacıyla sorgu gruplarına eklenebilir ve kaldırılabilir.

Plan kılavuzlarının yerine

Sorgu Deposu ipuçları öncesinde, geliştiricinin kullanımı karmaşık olabilecek benzer görevleri gerçekleştirmek için plan kılavuzlarına güvenmesi gerekirdi. Sorgu Deposu ipuçları, sorguların görsel olarak keşfi için SQL Server Management Studio'nun (SSMS) Sorgu Deposu özellikleriyle tümleştirilir.

Plan kılavuzları kullanarak, sorgu kod parçacıklarıyla tüm planlarda arama yapmanız gerekir. Sorgu Deposu ipuçları özelliği, sonuçta elde edilen sorgu planını etkilemek için tam olarak eşleşen sorgular gerektirmez. Sorgu Deposu'ndaki bir query_id'a, Sorgu Deposu ipuçları uygulanabilir.

Sorgu Deposu ipuçları, sabit kodlanmış deyim düzeyi ipuçlarını ve mevcut plan kılavuzlarını geçersiz kılar.

Daha yeni bir uyumluluk düzeyi düşünün

Yeni bir veritabanı uyumluluk düzeyi, örneğin satıcı belirtimleri veya daha büyük test gecikmeleri nedeniyle kullanılamadığında, Query Store ipuçları değerli bir yöntem olabilir. Bir veritabanı için daha yüksek bir uyumluluk düzeyi kullanılabiliyorsa, SQL Server'ın en son performans iyileştirmelerinden ve özelliklerinden yararlanmak için tek bir sorgunun veritabanı uyumluluk düzeyini yükseltmeyi göz önünde bulundurun.

Örneğin, uyumluluk düzeyi 140 olan bir veritabanına sahip bir SQL Server 2022 (16.x) örneğiniz varsa, uyumluluk düzeyi 160'ta tek tek sorguları çalıştırmak için Sorgu Deposu ipuçlarını kullanmaya devam edebilirsiniz. Aşağıdaki ipucunu kullanabilirsiniz:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION(USE HINT(''QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_160''))';

Tam bir ders için bkz. Sorgu Deposu ipucu örnekleri.

Yükseltmeden sonra daha eski bir uyumluluk düzeyini göz önünde bulundurun

Sorgu Deposu ipuçlarının yardımcı olabileceği bir diğer durum da sql Server örneği geçişi veya yükseltmesi sonrasında sorguların doğrudan değiştirilememe durumudur. Yeniden yazılana veya en son uyumluluk düzeyinde iyi performans gösteren başka bir şekilde ele alınana kadar sorgu için önceki uyumluluk düzeyini uygulamak için Sorgu Deposu ipuçlarını kullanın. Sorgu Deposu'nun gerileyen sorgular raporunu kullanarak, geçiş sırasında Sorgu Ayarlama Yardımcısı aracını veya diğer sorgu düzeyinde uygulama telemetrisini kullanarak daha yüksek bir uyumluluk düzeyiyle gerileyen aykırı sorgular belirleyin. Uyumluluk düzeyleri arasındaki farklar hakkında daha fazla bilgi için uyumluluk düzeyleri arasındaki farklarbölümünü gözden geçirin.

Yeni uyumluluk düzeyini performans test ettikten ve Sorgu Deposu ipuçlarını bu şekilde dağıttığınızda, kod değişikliği yapmadan önemli sorunlu sorguları önceki uyumluluk düzeyinde tutarken veritabanının uyumluluk düzeyinin tamamını yükseltebilirsiniz.

Sorunlu sorguların gelecekte yürütülmesini engelle

Sorgu ipucunu ABORT_QUERY_EXECUTION kullanarak bilinen sorunlu sorguların gelecekte yürütülmesini engelleyebilirsiniz; örneğin, yüksek kaynak tüketimine neden olan ve kritik uygulama iş yüklerini etkileyen önemsiz sorgular.

Note

ABORT_QUERY_EXECUTION sorgu ipucu yalnızca Azure SQL Veritabanı, Azure SQL Yönetilen ÖrneğiAUTD ve SQL Server 2025 'te (17.x) kullanılabilir.

Örneğin, 39'un gelecekteki yürütmesini query_id engellemek için aşağıdaki gibi sys.sp_query_store_set_hints yürütebilirsiniz:

EXECUTE sys.sp_query_store_set_hints
    @query_id = 39,
    @query_hints = N'OPTION (USE HINT (''ABORT_QUERY_EXECUTION''))';

Aynı sorgunun engelini kaldırmak için sys.sp_query_store_clear_hints yürütür:

EXECUTE sys.sp_query_store_clear_hints @query_id = 39;

Daha fazla bilgi için bkz. Sorgu Deposu ipucu örnekleri.

Aşağıdaki noktalara dikkat edilmelidir:

  • Bir sorgu için bu ipucunu belirttiğinizde, sorguyu yürütme girişimi 8778, önem derecesi 16 hatasıyla başarısız olur, ABORT_QUERY_EXECUTION ipucu belirtildiğinden sorgu yürütme durduruldu.

  • Bir sorgunun engelini kaldırmak için, query_id değerini @query_id parametresine geçirerek sys.sp_query_store_clear_hints saklı yordamında ipucunu temizleyebilirsiniz.

    • Bu saklı yordam, bir sorgu için tüm ipuçlarını temizler. Mevcut ipuçlarını koruyarak sorgunun engelini kaldırmak istiyorsanız, sys.sp_query_store_set_hints kullanarak ABORT_QUERY_EXECUTION ipucunu kaldırın, ancak diğer ipuçlarını koruyun.
  • Aşağıdaki örnek sorguda olduğu gibi Sorgu Deposu'nda engellenen sorguları bulmak için sistem görünümlerini kullanabilirsiniz:

    SELECT qsh.query_id,
           q.query_hash,
           qt.query_sql_text
    FROM sys.query_store_query_hints AS qsh
         INNER JOIN sys.query_store_query AS q
             ON qsh.query_id = q.query_id
         INNER JOIN sys.query_store_query_text AS qt
             ON q.query_text_id = qt.query_text_id
    WHERE UPPER(qsh.query_hint_text) LIKE '%ABORT[_]QUERY[_]EXECUTION%';
    
  • Değeri query_id almak için, Sorgu Deposu'na en az bir sorgu yürütmesinin kaydedilmesi gerekir. Bu yürütmenin başarılı olması gerekmez. Bu, zaman aşımına uğradı veya iptal edilen sorguların gelecekte yürütülmesinin engellenebileceği anlamına gelir.

  • Belirli bir sorgu karması olan tüm sorguları engellemeniz veya engellemeyi kaldırmanız gerekiyorsa otomasyon scripti kullanmayı göz önünde bulundurun. Örneğin dbo.sp_query_store_modify_hints_by_query_hash, sorgu karmasıyla eşleşen tüm sys.sp_query_store_set_hints değerleri için döngüde sys.sp_query_store_clear_hints ve query_id sistem saklı yordamlarını çağıran örnek bir saklı yordamdır.

  • Bir sorguyu engellediğinizde zaten yürütülüyorsa, yürütmesi devam eder. Sorguyu durdurmak için KILL deyimini kullanabilirsiniz.

    • Sorgu Deposu'nda, sonlandırılan sorguların yürütülmesi kaydedilmez. Sorgu henüz Sorgu Deposu'nda değilse, engelleyebileceğiniz bir query_id sorgu elde etmek için sorgunun bitmesine ya da zaman aşımına uğramasına izin vermeniz gerekir.
  • Bir sorgu ABORT_QUERY_EXECUTION ipucu tarafından engellendiğinde, execution_type görünümündeki execution_type_desc ve sütunları sırasıyla 4 ve İstisna olarak ayarlanır.

  • Tüm Sorgu Deposu ipuçlarında olduğu gibi, ALTER ipucunu ayarlamak ve ABORT_QUERY_EXECUTION ipucunu temizlemek için veritabanında izninizin olması gerekir.

Sorgu Deposu İpuçlarıyla İlgili Dikkat Edilmesi Gerekenler

Sorgu Deposu ipuçlarını dağıtırken aşağıdaki senaryoları göz önünde bulundurun.

Veri dağıtımı değişiklikleri

Plan kılavuzları, Sorgu Deposu aracılığıyla zorlanan planlar ve Sorgu Deposu ipuçları, iyileştiricinin karar verme sürecini geçersiz kılar. Sorgu Deposu ipucu şu anda yararlı olabilir, ancak gelecekte yararlı olmayabilir. Örneğin, bir Sorgu Deposu önerisi önceki veri dağıtımında bir sorguya yardımcı olduysa, büyük ölçekli DML işlemlerinin verileri değiştirmesi durumunda bu ters etki yaratabilir. Yeni bir veri dağıtımı, iyileştiricinin ipucundan daha iyi bir karar vermesine neden olabilir. Bu senaryo, plan davranışını zorlamanın en yaygın sonucudur.

Sorgu Deposu ipuçları stratejinizi düzenli olarak yeniden değerlendirme

Aşağıdaki durumlarda mevcut Sorgu Deposu ipuçları stratejinizi yeniden değerlendirin:

  • Bilinen büyük veri dağıtımı değişikliklerinin ardından.
  • Veritabanı için kullanılabilir kaynaklar değiştiğinde. Örneğin, Azure SQL Veritabanınızın, SQL Yönetilen Örneğinizin veya SQL Server sanal makinenizin işlem boyutu değiştiğinde.
  • Plan düzeltmenin kalıcılaştığı yer. Sorgu Deposu ipuçları en iyi kısa vadeli düzeltmeler için kullanılır.
  • Beklenmeyen performans regresyonları.

Geniş etki potansiyeli

Sorgu Deposu ipuçları parametre kümesi, kaynak uygulama, kullanıcı veya sonuç kümesinden bağımsız olarak sorgunun tüm yürütmelerini etkiler. Yanlışlıkla performans gerilemesi durumunda, sys.sp_query_store_set_hints ile oluşturulan Sorgu Deposu ipuçları sys.sp_query_store_clear_hintsile kolayca kaldırılabilir.

Sorgu Deposu ipuçlarını üretime uygulamadan önce görev açısından kritik veya hassas sistemler için test değişikliklerini dikkatle yükleyin.

Zorlamalı parametreleştirme ve YENIDEN DERLE ipucu desteklenmiyor

RECOMPILE PARAMETRELEME veritabanı seçeneği FORCED olarak ayarlandığında Sorgu Deposu ipuçlarıyla sorgu ipucunun uygulanması desteklenmez. Daha fazla bilgi için bkz. Zorlamalı ParametreleştirmeKullanma Yönergeleri.

İpucu RECOMPILE , veritabanı düzeyinde ayarlanmış zorlamalı parametreleme ile uyumlu değildir. Veritabanı zorlamalı parametreleştirme kullanıyorsa ve RECOMPILE ipucu sorgu için Sorgu Deposu'nda ayarlanan ipuçları dizesinin bir parçasıysa, Veritabanı Altyapısı ipucunu yoksayar RECOMPILE ve belirtilirse diğer ipuçlarını uygular. Ayrıca, Temmuz 2022'den itibaren Azure SQL Veritabanı'nda, RECOMPILE ipucunun yoksayıldığını belirten bir uyarı (hata kodu 12461) verilir.

Hangi sorgu ipuçlarının uygulanabileceği hakkında bilgi için bkz. Desteklenen sorgu ipuçları.