Aracılığıyla paylaş


Bulma ve benzer sorgular sorgu ve sorgu kullanarak ayarlama karmaları Plan

Yoğun sorguları için arama yaparken nasıl bulacağınızı ve topluca önemli miktarda sistem kaynak tüketmek benzer sorguları ayarlama düşünmelisiniz.The sys.dm_exec_query_stats and sys.dm_exec_requests dynamic management views provide query hash and query plan hash values that you can use to help determine the aggregate resource usage for similar queries and similar query execution plans.

Bu konuda sorgu karma ve sorgu planı karma, karma değerlerini Birikmeli Maliyet benzer sorgular ve yürütme planları bulmak için kullanma örnekleri sağlar ve benzer sorgular ve yürütme planları için performansı artırmak için yollar sunar tanımlar.

Sorgu karma ve sorgu planı karma anlama

Sorgu karma sorguda hesaplanan ve benzer mantığı ile sorguları tanımlamak için kullanılan bir ikili karma değerdir.sorgu iyileştiricisi Sorgu derleme sırasında sorgu karmasını hesaplar.Hazır bilgi değerleri yalnızca farklı sorgular aynı sorgu karmaya sahip.Örneğin, aşağıdaki iki sorgu yalnızca atanan hazır bilgi değerleri olarak birbirinden farklı olduğundan aynı sorgu karma sahip FirstName ve LastName.

USE AdventureWorks2008R2;
GO
SELECT I.CustomerID, I.AccountNumber, P.FirstName, P.LastName, A.AddressLine1, A.City 
FROM Person.Person AS P
    JOIN Sales.Customer AS I ON P.BusinessEntityID = I.PersonID
    JOIN Person.BusinessEntityAddress AS BA ON BA.BusinessEntityID = I.PersonID
    JOIN Person.Address AS A ON A.AddressID = BA.AddressID
    WHERE P.FirstName = 'Amanda' AND P.LastName = 'Allen';
GO
SELECT I.CustomerID, I.AccountNumber, P.FirstName, P.LastName, A.AddressLine1, A.City 
FROM Person.Person AS P
    JOIN Sales.Customer AS I ON P.BusinessEntityID = I.PersonID
    JOIN Person.BusinessEntityAddress AS BA ON BA.BusinessEntityID = I.PersonID
    JOIN Person.Address AS A ON A.AddressID = BA.AddressID
    WHERE P.FirstName = 'Logan' AND P.LastName = 'Jones';
GO
--Show the query hash for both queries.
SELECT st.text AS "Query Text", qs.query_hash AS "Query Hash"
FROM sys.dm_exec_query_stats qs 
CROSS APPLY sys.dm_exec_sql_text (qs.sql_handle) st
    WHERE st.text = 'SELECT I.CustomerID, I.AccountNumber, P.FirstName, P.LastName, A.AddressLine1, A.City 
FROM Person.Person AS P
    JOIN Sales.Customer AS I ON P.BusinessEntityID = I.PersonID
    JOIN Person.BusinessEntityAddress AS BA ON BA.BusinessEntityID = I.PersonID
    JOIN Person.Address AS A ON A.AddressID = BA.AddressID
    WHERE P.FirstName = ''Amanda'' AND P.LastName = ''Allen'';
' OR st.text = 'SELECT I.CustomerID, I.AccountNumber, P.FirstName, P.LastName, A.AddressLine1, A.City 
FROM Person.Person AS P
    JOIN Sales.Customer AS I ON P.BusinessEntityID = I.PersonID
    JOIN Person.BusinessEntityAddress AS BA ON BA.BusinessEntityID = I.PersonID
    JOIN Person.Address AS A ON A.AddressID = BA.AddressID
    WHERE P.FirstName = ''Logan'' AND P.LastName = ''Jones'';
';
GO

Çünkü onların farklılıkları mantıksal aşağıdaki iki sorgu farklı sorgu sağlamalarının sahip (ve karşı veya) ve yalnızca harfleri için sınırlı değildir.

USE AdventureWorks2008R2;
GO
SELECT I.CustomerID, I.AccountNumber, P.FirstName, P.LastName, A.AddressLine1, A.City 
FROM Person.Person AS P
    JOIN Sales.Customer AS I ON P.BusinessEntityID = I.PersonID
    JOIN Person.BusinessEntityAddress AS BA ON BA.BusinessEntityID = I.PersonID
    JOIN Person.Address AS A ON A.AddressID = BA.AddressID
    WHERE P.FirstName = 'Amanda' AND P.LastName = 'Allen';
GO
SELECT I.CustomerID, I.AccountNumber, P.FirstName, P.LastName, A.AddressLine1, A.City 
FROM Person.Person AS P
    JOIN Sales.Customer AS I ON P.BusinessEntityID = I.PersonID
    JOIN Person.BusinessEntityAddress AS BA ON BA.BusinessEntityID = I.PersonID
    JOIN Person.Address AS A ON A.AddressID = BA.AddressID
    WHERE P.FirstName = 'Logan' OR P.LastName = 'Jones';
GO
--Show the query hash for both queries.
SELECT st.text AS "Query Text", qs.query_hash AS "Query Hash"
FROM sys.dm_exec_query_stats qs 
CROSS APPLY sys.dm_exec_sql_text (qs.sql_handle) st
    WHERE st.text = 'SELECT I.CustomerID, I.AccountNumber, P.FirstName, P.LastName, A.AddressLine1, A.City 
FROM Person.Person AS P
    JOIN Sales.Customer AS I ON P.BusinessEntityID = I.PersonID
    JOIN Person.BusinessEntityAddress AS BA ON BA.BusinessEntityID = I.PersonID
    JOIN Person.Address AS A ON A.AddressID = BA.AddressID
    WHERE P.FirstName = ''Amanda'' AND P.LastName = ''Allen'';
' OR st.text = 'SELECT I.CustomerID, I.AccountNumber, P.FirstName, P.LastName, A.AddressLine1, A.City 
FROM Person.Person AS P
    JOIN Sales.Customer AS I ON P.BusinessEntityID = I.PersonID
    JOIN Person.BusinessEntityAddress AS BA ON BA.BusinessEntityID = I.PersonID
    JOIN Person.Address AS A ON A.AddressID = BA.AddressID
    WHERE P.FirstName = ''Logan'' OR P.LastName = ''Jones'';
';
GO

Sorgu planı karma sorgu yürütme planı üzerinde hesaplanan ve benzer sorgu yürütme planları tanımlamak için kullanılan bir ikili karma değerdir.sorgu iyileştiricisi Yürütme planı değerleri gibi fiziksel ve mantıksal işleçleri ve önemli işleç öznitelikleri alt küme küme kümesini kullanarak sorgu derleme sırasında sorgu planı karmasını hesaplar.Aynı fiziksel ve mantıksal işletmen ağaç yapısı olduğu gibi öznitelikleri alt küme küme kümesini önemli işleç, özdeş öznitelik değerleri olan sorgu yürütme planları aynı sorgu planı karma olacaktır.

Sorgu sonuçlar kardinalite farklılıkları karşı farklı veri ile aynı sorgu sağlamalarının sorguları yürütüldüğünde farklı sorgu planı sağlamalarının kaynaklanan farklı sorgu yürütme planları seçmek sorgu iyileştiricisi neden olabilir.

Aşağıdaki örnekte gösterilmektedir nasıl iki benzer sorgular sorgu aynı karmaya sahip olabilir, ancak aynı sorgu yürütme planı olabilir.Karma değerleri görüntülemek için iki yol vardır: Son deyim ve burada bunlar listelenen Showplan xml StmtSimple öðenin öznitelik değerleri olarak QueryHash ve QueryPlanHash.

USE AdventureWorks2008R2;
GO
SET STATISTICS XML ON;
GO
SELECT T.TransactionID, T.TransactionDate, P.ProductID, P.Name FROM Production.TransactionHistory T
    JOIN Production.Product P
    ON T.ProductID = P.ProductID
WHERE P.ProductID = 1;
GO
SELECT T.TransactionID, T.TransactionDate, P.ProductID, P.Name FROM Production.TransactionHistory T
    JOIN Production.Product P
    ON T.ProductID = P.ProductID
WHERE P.ProductID = 3;
GO
SET STATISTICS XML OFF;
GO
--Show the query_hash and query plan hash
SELECT ST.text AS "Query Text", QS.query_hash AS "Query Hash", 
    QS.query_plan_hash AS "Query Plan Hash"
FROM sys.dm_exec_query_stats QS
    CROSS APPLY sys.dm_exec_sql_text (QS.sql_handle) ST
WHERE ST.text = 'SELECT T.TransactionID, T.TransactionDate, P.ProductID, P.Name FROM Production.TransactionHistory T
    JOIN Production.Product P
    ON T.ProductID = P.ProductID
WHERE P.ProductID = 1;
' OR ST.text = 'SELECT T.TransactionID, T.TransactionDate, P.ProductID, P.Name FROM Production.TransactionHistory T
    JOIN Production.Product P
    ON T.ProductID = P.ProductID
WHERE P.ProductID = 3;
';
GO

İçin kardinalite tahminleri, ProductID = 3 yüksek olduğu sorgu iyileştiricisi dizin tarama işleç sorgu planı. kullanıyor olabilirProductID için kardinalite tahminleri ise = 1 düşük, sorgu iyileştiricisi işleci kullanımı dizin arama.

Olmayan Özgünlüğü karma değerleri için

Karma çarpışmaları hangi benzemez sorgu ve sorgu planları aynı karma değere sahip olması mümkündür.Karma çarpışma olasılığı çok küçük ve gerçekleşmesi olası olmakla birlikte, sorgunun benzersiz üzerinde bağımlı uygulamaları karma ve sorgu planı karma hataları nedeniyle yinelenen karma değere sahip olabilir.Örneğin, sorgu karma ve sorgu planı karma olarak bir birincil anahtar veya benzersiz bir sütun kullanılmamalıdır.

Birikmeli Maliyet sorguların bulma

Aşağıdaki örnekte üst beş sorguları göre ortalama cpu saat hakkında bilgi verir.Bu örnekte, mantıksal olarak eşdeğer sorguları kendi toplu kaynak tüketimini gruplanması sorguları sorgu karma değerlerine göre toplar.

USE AdventureWorks2008R2;
GO
SELECT TOP 5 query_stats.query_hash AS "Query Hash", 
    SUM(query_stats.total_worker_time) / SUM(query_stats.execution_count) AS "Avg CPU Time",
    MIN(query_stats.statement_text) AS "Statement Text"
FROM 
    (SELECT QS.*, 
    SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
    ((CASE statement_end_offset 
        WHEN -1 THEN DATALENGTH(ST.text)
        ELSE QS.statement_end_offset END 
            - QS.statement_start_offset)/2) + 1) AS statement_text
     FROM sys.dm_exec_query_stats AS QS
     CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) as ST) as query_stats
GROUP BY query_stats.query_hash
ORDER BY 2 DESC;
GO

Aşağıdaki örnek için ortalama cpu göre ilk beş sorgu planları hakkında bilgi verir saat.Böylece aynı sorgu planı karma sorgularla toplu kaynak tüketimini Bu örnek sorguları sorgu planı karma değerlerine göre toplar.

USE AdventureWorks2008R2;
GO
SELECT TOP 5 query_plan_hash AS "Query Plan Hash",
    SUM(total_worker_time)/SUM(execution_count) AS "Avg CPU Time",
    MIN(CAST(query_plan as varchar(max))) AS "ShowPlan XML"
FROM sys.dm_exec_query_stats AS QS CROSS APPLY 
    sys.dm_exec_query_plan(QS.plan_handle)
GROUP BY query_plan_hash
ORDER BY 2 DESC;
GO

Sorgu karma ve sorgu planı karma sorgu performansını artırmak için kullanma

İzleme ve yürütme planı değişiklikleri öğrenmek

Performans degradations veya iyileştirmeler bir sorgu çekirdekler ve farklı sorgu yürütme planı sorgu iyileştiricisi üretir oluşabilir.Sorgu planı karma kullanarak, yakalama, saklamak ve üzerinden sorgu yürütme planları karşılaştırmak saat.Hangi yürütme planları değişti verileri ve yapılandırma değişikliklerin performans üzerindeki etkisini tanılamanıza yardımcı olabilir bilmek.

Örneğin, sistem değiştirdikten sonra yapılandırma, kendi özgün sorgu planı karma değerleri için kritik sorguları için sorgu planı karma değerleri karşılaştırabilirsiniz.Sorgu planı karma değerler farkları öğrenebilirsiniz, sistem yapılandırma önemli sorguları için güncelleştirilmiş sorgu yürütme planları içinde değişiklik sonuçlandı.Alt sorgu içinde karma düşünüyorsanız, uzun süredir çalışan geçerli sorgu için yürütme durdurmak de karar verebilir sys.dm_exec_requests temel sorgu planı karma, hangi olduğu bilinen var. iyi performans'den farklıdır

Önbelleğe alınan planı yeniden geliştirmek için benzer sorgular stratejisinin

Yoksa bir küme sorguları aynı sorgu karma ve sorgu planı karma var, tek parametreli sorgu oluşturarak performansı iyileştirebilir.Çağırma parametreleri yerine, hazır bilgi değerleri ile birden çok sorgu içeren bir sorgu yeniden önbelleğe alınan sorgu yürütme planı kullanılmasına izin verir.Önbelleğe alınan sorgu planlarını yeniden kullanma yararları hakkında daha fazla bilgi için bkz: Yeniden yürütme planı önbellekleme ve.

Uygulamayı değiştirebilir, benzer bir sonuç elde etmek için zorunlu parameterizasyonunu ile şablon planı kılavuzları kullanabilirsiniz.Daha fazla bilgi için bkz: Plan kılavuzları kullanarak sorgu parameterizasyonunu davranışı belirtme.