sys.dm_exec_query_optimizer_info (Transact-SQL)
gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Returnerar detaljerad statistik om hur SQL Server-frågeoptimeraren fungerar. Du kan använda den här vyn när du justerar en arbetsbelastning för att identifiera problem med frågeoptimering eller förbättringar. Du kan till exempel använda det totala antalet optimeringar, det förflutna tidsvärdet och det slutliga kostnadsvärdet för att jämföra frågeoptimeringarna för den aktuella arbetsbelastningen och eventuella ändringar som observerats under justeringsprocessen. Vissa räknare tillhandahåller data som endast är relevanta för intern diagnostikanvändning i SQL Server. Dessa räknare är markerade som "Endast internt".
Not
Om du vill anropa detta från Azure Synapse Analytics eller Analytics Platform System (PDW) använder du namnet sys.dm_pdw_nodes_exec_query_optimizer_info
. Den här syntaxen stöds inte av en serverlös SQL-pool i Azure Synapse Analytics.
Namn | Datatyp | Beskrivning |
---|---|---|
counter |
nvarchar(4000) | Namn på statistikhändelse för optimerare. |
occurrence |
bigint | Antal förekomster av optimeringshändelse för den här räknaren. |
value |
flyttal | Genomsnittligt egenskapsvärde per händelsehändelse. |
pdw_node_id |
int | Identifieraren för noden som den här fördelningen är på. gäller för: Azure Synapse Analytics, Analytics Platform System (PDW) |
Behörigheter
SQL Server 2019 (15.x) och tidigare versioner och Azure SQL Managed Instance kräver VIEW SERVER STATE
behörighet.
SQL Server 2022 (16.x) och senare versioner kräver VIEW SERVER PERFORMANCE STATE
behörighet på servern.
I Azure SQL Database Basic, S0och S1 servicemål och för databaser i elastiska pooler, kontot serveradministratör konto, Microsoft Entra-administratör konto eller medlemskap i ##MS_ServerStateReader##serverrollen. För alla andra SQL Database-tjänstmål krävs antingen VIEW DATABASE STATE
behörighet för databasen eller medlemskap i ##MS_ServerStateReader## serverroll.
Anmärkningar
sys.dm_exec_query_optimizer_info
innehåller följande egenskaper (räknare). Alla förekomstvärden är kumulativa och är inställda på 0
vid omstart av systemet. Alla värden för värdefält är inställda på NULL
vid omstart av systemet. Alla värdekolumnvärden som anger ett medelvärde använder förekomstvärdet från samma rad som nämnaren i beräkningen av medelvärdet. Alla frågeoptimeringar mäts när SQL Server fastställer ändringar i dm_exec_query_optimizer_info
, inklusive både användargenererade och systemgenererade frågor. Körning av en redan cachelagrad plan ändrar inte värden i dm_exec_query_optimizer_info
, endast optimeringar är betydande.
Räknare | Förekomst | Värde |
---|---|---|
optimizations |
Totalt antal optimeringar. | Ej tillämpligt |
elapsed time |
Totalt antal optimeringar. | Genomsnittlig förfluten tid per optimering av en enskild instruktion (fråga) i sekunder. |
final cost |
Totalt antal optimeringar. | Genomsnittlig uppskattad kostnad för en optimerad plan i interna kostnadsenheter. |
trivial plan |
Endast internt | Endast internt |
tasks |
Endast internt | Endast internt |
no plan |
Endast internt | Endast internt |
search 0 |
Endast internt | Endast internt |
search 0 time |
Endast internt | Endast internt |
search 0 tasks |
Endast internt | Endast internt |
search 1 |
Endast internt | Endast internt |
search 1 time |
Endast internt | Endast internt |
search 1 tasks |
Endast internt | Endast internt |
search 2 |
Endast internt | Endast internt |
search 2 time |
Endast internt | Endast internt |
search 2 tasks |
Endast internt | Endast internt |
gain stage 0 to stage 1 |
Endast internt | Endast internt |
gain stage 1 to stage 2 |
Endast internt | Endast internt |
timeout |
Endast internt | Endast internt |
memory limit exceeded |
Endast internt | Endast internt |
insert stmt |
Antal optimeringar som gäller för INSERT -instruktioner. |
Ej tillämpligt |
delete stmt |
Antal optimeringar som gäller för DELETE -instruktioner. |
Ej tillämpligt |
update stmt |
Antal optimeringar som gäller för UPDATE -instruktioner. |
Ej tillämpligt |
merge stmt |
Antal optimeringar som gäller för MERGE -instruktioner. |
Ej tillämpligt |
contains subquery |
Antal optimeringar för en fråga som innehåller minst en underfråga. | Ej tillämpligt |
unnest failed |
Endast internt | Endast internt |
tables |
Totalt antal optimeringar. | Genomsnittligt antal tabeller som refereras till per fråga optimerad. |
hints |
Antal gånger som vissa tips har angetts. Tips som räknas är: JOIN , GROUP , UNION och FORCE ORDER frågetips, FORCE PLAN ange alternativ och kopplingstips. |
Ej tillämpligt |
order hint |
Antal gånger som anslutningsordningen tvingades. Den här räknaren är inte begränsad till FORCE ORDER tips. Om du anger en kopplingsalgoritm i en fråga, till exempel en INNER HASH JOIN , framtvingas även kopplingsordningen, vilket ökar räknaren. |
Ej tillämpligt |
join hint |
Antal gånger som kopplingsalgoritmen tvingades av ett kopplingstips. Det FORCE ORDER frågetipset ökar inte den här räknaren. |
Ej tillämpligt |
view reference |
Antal gånger som en vy refereras till i en fråga. | Ej tillämpligt |
remote query |
Antal optimeringar där frågan refererade till minst en fjärrdatakälla, till exempel en tabell med ett namn i fyra delar eller ett OPENROWSET resultat. |
Ej tillämpligt |
maximum DOP |
Totalt antal optimeringar. | Genomsnittligt effektivt MAXDOP värde för en optimerad plan. Som standard bestäms effektiva MAXDOP av maximal grad av parallellitet serverkonfigurationsalternativet och kan åsidosättas för en specifik fråga med värdet för MAXDOP frågetips. |
maximum recursion level |
Antal optimeringar där en MAXRECURSION nivå som är större än 0 angavs med frågetipset. |
Genomsnittlig MAXRECURSION nivå i optimeringar där en maximal rekursionsnivå angavs med frågetipset. |
indexed views loaded |
Endast internt | Endast internt |
indexed views matched |
Antal optimeringar där en eller flera indexerade vyer matchas. | Genomsnittligt antal visningar som matchas. |
indexed views used |
Antal optimeringar där en eller flera indexerade vyer används i utdataplanen efter matchning. | Genomsnittligt antal vyer som används. |
indexed views updated |
Antal optimeringar av en DML-instruktion som skapar en plan som underhåller en eller flera indexerade vyer. | Genomsnittligt antal vyer som underhålls. |
dynamic cursor request |
Antal optimeringar där en begäran om dynamisk markör har angetts. | Ej tillämpligt |
fast forward cursor request |
Antal optimeringar där en snabbsnabb markörbegäran har angetts. | Ej tillämpligt |
Exempel
A. Visa statistik om körning av optimerare
Vilken är den aktuella körningsstatistiken för optimeraren för den här instansen av SQL Server?
SELECT * FROM sys.dm_exec_query_optimizer_info;
B. Visa det totala antalet optimeringar
Hur många optimeringar utförs?
SELECT occurrence AS Optimizations
FROM sys.dm_exec_query_optimizer_info
WHERE counter = 'optimizations';
C. Genomsnittlig förfluten tid per optimering
Vad är den genomsnittliga förflutna tiden per optimering?
SELECT ISNULL(value,0.0) AS ElapsedTimePerOptimization
FROM sys.dm_exec_query_optimizer_info
WHERE counter = 'elapsed time';
D. Del av optimeringar som omfattar underfrågor
Vilken del av optimerade frågor innehöll en underfråga?
SELECT (
SELECT CAST(occurrence AS FLOAT)
FROM sys.dm_exec_query_optimizer_info
WHERE counter = 'contains subquery'
) / (
SELECT CAST(occurrence AS FLOAT)
FROM sys.dm_exec_query_optimizer_info
WHERE counter = 'optimizations'
) AS ContainsSubqueryFraction;
E. Visa det totala antalet tips under optimeringen
Hur många tips räknas när FORCE ORDER
ingår som ett frågetips?
-- Check hint count before query execution
SELECT ISNULL('', 0) AS [Before],
[counter],
occurrence
FROM sys.dm_exec_query_optimizer_info
WHERE [counter] IN (
'hints',
'order hint',
'join hint'
);
SELECT poh.PurchaseOrderID,
poh.OrderDate,
pod.ProductID,
pod.DueDate,
poh.VendorID
FROM Purchasing.PurchaseOrderHeader AS poh
INNER MERGE JOIN Purchasing.PurchaseOrderDetail AS pod
ON poh.PurchaseOrderID = pod.PurchaseOrderID
OPTION (
FORCE ORDER,
RECOMPILE
);
-- check hint count after query execution
SELECT ISNULL('', 0) AS [After],
[counter],
occurrence
FROM sys.dm_exec_query_optimizer_info
WHERE [counter] IN (
'hints',
'order hint',
'join hint'
);