[SQL SERVER][Memo]Trivial Plan

[SQL SERVER][Memo]Trivial Plan

今天看一些關於執行計畫的文章,終於了解Trivial Plan到底是什麼?

自己整理筆記一下。

 

什麼是一般計畫(Trivial Plan)

查詢最佳化程式(Query Optimizer)最主要目的就是建立低成本(CBO為基礎)執行計畫,

產生過程中,第一階的計劃就是一般計畫。

我們知道一些簡單的查詢可能只有一種執行方法,好比一個Table沒有任何Index,

當要搜尋該Table資料只有執行Full Table Scan方法,

而SQL Server會自行維護 Trivial Plan 清單供查詢最佳化程式比對,

如果有找到並比對成功,那就會建立相似執行計畫,而不會經過任何最佳化過程,

但如果是一個複雜的查詢,可能就會有相當多的排列組合,所以查詢最佳化程式並不會評估所有可能性,

而是嘗試找出夠好(低成本)的執行計畫,因為尋找完美的執行計畫不一定每次都可行,

評估所有可能性來找出最完美的執行計畫所花費的成本可能還比所獲得效能效益還要高(下圖為查詢最佳化程式步驟)。

 

image

查詢最佳化程式步驟。

 

接下來我們透過dm_exec_query_optimizer_info 來觀察一般計畫和最佳化總數發生情況

 

目前一般計畫和最佳化總數數值

--一般計畫
SELECT * FROM sys.dm_exec_query_optimizer_info  
WHERE counter='trivial plan' 
go
--最佳化總數
SELECT occurrence AS Optimizations FROM sys.dm_exec_query_optimizer_info
WHERE counter = 'optimizations';
go

 

 

 

 

 

 

image

occurrence=118,optimiztons=327。

 

我執行簡單查詢後再來查看相關改變

select * from USERPROFILE
where ACCOUNT ='rico'

image

 

select * from USERPROFILE

image

可以看到執行不同的TSQL 語法, occurrence 和 Optimizations 會依執行次數增加,

因為SQL Server針對TSQL 語法的快取和重用,

需格式完全相同,不可存在任何差異(大小寫、空白、斷行..等)。

 

接下來我建立一個SP,再來觀察相關變化

create proc [dbo].[usp_getuserprofile]
(@account varchar(20))
as 
if len(@account)>0
    begin
        select * from USERPROFILE
        where ACCOUNT=@account
    end
 else
   begin
        select * from USERPROFILE
  end     

 

第一次

image

 

第二次

image

 

第三次

image

執行3次該SP,但 occurrence 和Optimizations 卻沒有增加,這是因為快取中已有該執行計畫,

這裡剛好也驗證說明,如果你要提高執行計畫的重用,建議使用SP來取代 TSQL 語法。

 

 

 

 

 

 

參考

Trivial Plan

sys.dm_exec_query_optimizer_info (Transact-SQL)