Sorgu ipuçlarını anlama
Sorgu ipuçları, sorgu işlemcisinin SELECT, INSERT, UPDATE, veya DELETE deyimleri için yürütme planında belirli bir işleci kullanmasını zorunlu kılmak amacıyla uygulanabilecek seçenekler veya stratejilerdir. Sorgu ipuçları, sorgu işlemcisinin yan tümcesiyle OPTION belirli bir sorgu için seçebileceği herhangi bir yürütme planını geçersiz kılar.
Çoğu durumda sorgu iyileştiricisi dizinlere, istatistiklere ve veri dağıtımına göre verimli bir yürütme planı seçer. Veritabanı yöneticilerinin el ile müdahale etme ihtiyacı nadiren vardır.
Sorgunun sonuna sorgu ipuçları ekleyerek sorgunun yürütme planını değiştirebilirsiniz. Örneğin, tek cpu kullanan bir sorgunun sonuna eklerseniz OPTION (MAXDOP <integer_value>) , sorgu seçtiğiniz değere bağlı olarak birden çok CPU (paralellik) kullanabilir. İsterseniz, sorgunun her yürütülürken yeni ve geçici bir plan oluşturduğundan emin olmak için de kullanabilirsiniz OPTION (RECOMPILE) .
--With maxdop hint
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (MAXDOP 2)
GO
--With recompile hint
SELECT City
FROM Person.Address
WHERE StateProvinceID=15 OPTION (RECOMPILE)
GO
Sorgu ipuçları performansla ilgili çeşitli sorunlara yerelleştirilmiş bir çözüm sağlasa da, bunları aşağıdaki nedenlerle üretim ortamında kullanmaktan kaçınmanız gerekir.
- Sorgunuzda kalıcı bir sorgu ipucu olması, bu sorgu için yararlı olabilecek yapısal veritabanı değişikliklerinin geçerli olmamasıyla sonuçlanabilir.
- Sorguyu belirli bir yürütme planına bağlarsanız SQL Server'ın sonraki sürümlerindeki yeni ve geliştirilmiş özelliklerden yararlanamazsınız.
Ancak, SQL Server'da farklı amaçlar için kullanılan çeşitli sorgu ipuçları vardır. Aşağıda bunlardan birkaçını ele alalım:
FAST <integer_value>—sorgu yürütmeye devam ederken ilk <integer_value> satır sayısını alır. Hızlı sorgu ipucu için küçük veri kümeleriyle ve düşük değerle daha iyi çalışır. Satır sayısı arttıkça sorgu maliyeti de artar.OPTIMIZE FOR—sorgu iyileştiricisine, bir sorgu derlendiğinde ve iyileştirildiğinde yerel değişken için belirli bir değerin kullanılması gerektiğine ilişkin yönergeler sağlar.USE PLAN—sorgu iyileştiricisi , xml_plan özniteliği tarafından belirtilen bir sorgu planını kullanır.RECOMPILE—sorgu için yeni, geçici bir plan oluşturur ve sorgu yürütüldükten hemen sonra atar.{ LOOP | MERGE | HASH } JOIN—tüm birleştirme işlemlerinin, sorgunun tamamındaLOOP JOIN,MERGE JOINveyaHASH JOINtarafından gerçekleştirildiğini belirtir. Birden fazla birleştirme ipucu belirtirseniz, optimizatör seçenekler arasından en düşük maliyetli birleştirme stratejisini seçer.MAXDOP <integer_value>—paralellik değerinin en yüksek derecesinisp_configuregeçersiz kılar. Bu seçeneği belirten sorgu, Resource Governor'ı da geçersiz kılar.
Aynı sorguya birden çok sorgu ipucu da uygulayabilirsiniz. Aşağıdaki örnek, aynı sorguda HASH GROUP ve FAST <integer_value> sorgu ipuçlarını kullanır.
SELECT ProductID, OrderQty, SUM(LineTotal) AS Total
FROM Sales.SalesOrderDetail
WHERE UnitPrice < $5.00
GROUP BY ProductID, OrderQty
ORDER BY ProductID, OrderQty
OPTION (HASH GROUP, FAST 10);
GO
Sorgu ipuçları hakkında daha fazla bilgi edinmek için bkz. İpuçları (Transact-SQL).
Query Store ipuçları
Sorgu Deposu ipuçları , uygulama kodunu değiştirmeden sorgu planlarını şekillendirmek için basit bir yöntem sağlar.
Sorgu Deposu ipuçları, sorgu iyileştiricisi verimli bir yürütme planı oluşturmadığında ve geliştirici veya DBA özgün sorgu metnini değiştiremiyorsa yararlıdır. Bazı uygulamalarda sorgu metni sabit kodlanabilir veya otomatik olarak oluşturulabilir.
Sorgu Deposu ipuçlarını kullanmak için, Sorgu Deposu katalog görünümleri, yerleşik Sorgu Deposu raporları veya Azure SQL Veritabanı için Sorgu Performansı İçgörüleri aracılığıyla değiştirmek istediğiniz sorgu deyiminin Sorgu Deposu query_id tanımlamanız gerekir. Ardından, sorguya uygulamak istediğiniz sp_query_store_set_hints ve sorgu ipucu dizesiyle 'yi yürütün.
Aşağıdaki örnek, belirli bir sorgu için query_id nasıl elde edileceğini ve ardından RECOMPILE ve MAXDOP ipuçlarını sorguya uygulamak için nasıl kullanılacağını göstermektedir.
SELECT q.query_id, qt.query_sql_text
FROM sys.query_store_query_text qt
INNER JOIN sys.query_store_query q
ON qt.query_text_id = q.query_text_id
WHERE query_sql_text like N'%ORDER BY CustomerName DESC%'
AND query_sql_text not like N'%query_store%'
GO
--Assuming the query_id returned by the previous query is 42
EXEC sys.sp_query_store_set_hints @query_id= 42, @query_hints = N'OPTION(RECOMPILE, MAXDOP 1)'
GO
Sorgu Deposu ipuçlarının sorgu düzeyi performans sorunlarına yardımcı olabileceği birkaç senaryo vardır.
- Her yürütmede bir sorguyu yeniden derle.
- İstatistik güncelleştirme işlemi için en yüksek paralellik derecesini sınırlayın.
- İç içe döngü birleşimi yerine Hash birleşimi kullanın.
- Veritabanını geçerli uyumlulukta tutarken belirli bir sorgu için uyumluluk düzeyi 110 kullanın.
Sorgu Deposu ipuçları hakkında daha fazla bilgi için bkz. Sorgu Deposu ipuçları.