1. 程式人生 > >sql 獲取批處理信息的腳本(優化器在處理批處理時所發生的優化器事件)

sql 獲取批處理信息的腳本(優化器在處理批處理時所發生的優化器事件)

ren custom 列表 sys ase run 重用 pro 查詢

--獲取批處理信息的腳本(優化器在處理批處理時所發生的優化器事件)
SET NOCOUNT ON;
DBCC FREEPROCCACHE;
--清空過程緩存
GO
--使用tempdb..Optstats表來捕獲執行幾次
IF ( OBJECT_ID(dbo.tempdb..Optstats) IS NOT NULL )
    DROP TABLE tempdb..Optstats;
GO
--創建臨時表tempdb..Optstats
SELECT  0 Run ,
        *
INTO    tempdb..Optstats
FROM    sys.dm_exec_query_optimizer_info;
GO --該語句的計劃將被保存到過程緩存 --這樣下一次執行時不會產生任何優化器事件 --後面的Go用於確保下次執行這段腳本時可以重用Insert計劃 GO INSERT INTO tempdb..Optstats SELECT 2 Run , * FROM sys.dm_exec_query_optimizer_info; GO --清空臨時列表 TRUNCATE TABLE tempdb..Optstats; GO --存儲運行前的信息 GO INSERT INTO tempdb..Optstats
SELECT 1 Run , * FROM sys.dm_exec_query_optimizer_info; GO --執行批處理語句 SELECT C.CustomerID , COUNT(O.OrderID) NumOrders FROM dbo.Customers C LEFT JOIN dbo.Orders O ON O.CustomerID = C.CustomerID WHERE C.City = London GROUP BY C.CustomerID
HAVING COUNT(O.OrderID) > 5 ORDER BY NumOrders; GO --保存到臨時表 INSERT INTO tempdb..Optstats SELECT 2 Run , * FROM sys.dm_exec_query_optimizer_info; GO /*從臨時表中取出Run1和Run2之間Occurrence或Value值發生改變的所有事件 然後顯示執行批處理或查詢之前(Run1Occurrence和Run1Value)和之後所有這些事件(Run2Occurrence和Run2Value)的Occurrence和Value*/ WITH X ( Run, Counter, Occurrence, Value ) AS ( SELECT * FROM tempdb..Optstats WHERE Run = 1 ), Y ( Run, Counter, Occurrence, Value ) AS ( SELECT * FROM tempdb..Optstats WHERE Run = 2 ) SELECT X.Counter , Y.Occurrence - X.Occurrence Occurrence , CASE Y.Occurrence - X.Occurrence WHEN 0 THEN Y.Value * Y.Occurrence - X.Value * X.Occurrence ELSE ( Y.Value * Y.Occurrence - X.Value * X.Occurrence ) / ( Y.Occurrence - X.Occurrence ) END Value FROM X JOIN Y ON X.Counter = Y.Counter AND ( X.Occurrence <> Y.Occurrence OR X.Value <> Y.Value ); GO --刪除臨時表 DROP TABLE tempdb..Optstats; GO

sql 獲取批處理信息的腳本(優化器在處理批處理時所發生的優化器事件)