資料庫效能調教 – Execution Plan 有話要說

資料庫效能調教 – Execution Plan 有話要說

ID-100287684

當Query 傳送到資料庫執行時,Query Optimizer 會針對 query 語句進行計算,

怎樣的執行方式會相對比較少的成本 Cost,決定相對比較少成本的 Cost 之後就開始執行

 

舉例來說,下列這三個 Query:

select * from [HumanResources].[Employee]
select * from [HumanResources].[Employee] where OrganizationLevel > 3
select * from [HumanResources].[Employee] where businessEntityID = 1

 

Ctrl + M (Include Actual Execution Plan)執行結果如下

3 Query Execution plan

 

這個 Execution Plan 告訴我們幾件事情

1. Query Cost (relative to the batch)

  • Query 1: Query Cost (relative to the batch): 41%
  • Query 2: Query Cost (relative to the batch): 42%
  • Query 3: Query Cost (relative to the batch): 17%

 

相對來說,Query 1 執行所需的成本為整體的 41%。

而 Query 3是這三個query 中有效率的執行,因為相對成本只有 17%

 

2. 傳回資料的多寡

每個 Operation 又到左的箭頭線條的粗細代表資料傳回的多寡

這個例子,Query 1/2 的連線箭頭相對於 Query 3 粗

因此 Query 1/2 所回傳的資料量也比較大

 

3. Operation

Operation 為 Execution plan 中每一個方塊的執行動作,

資料流從右到左執行相所需要的資料運算取得

例如:

Query 1/2 最右邊的 operation 為 “Clustered Index Scan”

Query 3 則是 “Clustered Index Seek”

 

Ps. 以Performance 來說,大部分的情況 Seek 的效能會比 Scan 好很多,

也就是我們會比較不希望看到 Scan 的出現,例如 Index Scan or Table Scan等

 

 

4. Estimated/Actual Number of Rows

Query optimizer 會對目前的資料狀態進行統計分析計算相關成本,

因此統計資訊抽樣的資訊是否可以代表實際資料量就很重要

因為統計資訊抽樣的誤差,也會導致optimizer 選擇錯誤的 Execution plan

那麼要如何知道目前的統計抽樣是否符合實際狀況呢?

於最右邊的 operation (這個例子為 clustered index),Tooltip 顯示

  • Number of estimated Row: 290
  • Number of Actual Row: 290

這兩個值越接近,表示統計抽樣資訊越代表實際執行狀況。

如果這兩個值差異很大,表示統計抽樣資訊有些失真。

資料庫管理員可以考慮手動更新該資料表的統計資訊。

 

 

estimated actual number of row

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *