SQL 用 SET STATISTICS 陳述式查看統計資訊

May 13, 2024

在 MS-SQL 中,SET 陳述式 (SET Statement) 可以設定要不要輸出一些特定的資訊。SET STATISTICS 提供好幾種陳述式,可用來顯示查詢的統計資訊,快速確認查詢的效能。

SET STATISTICS IO ON

可顯示出該次查詢的讀取資訊,對於判斷執行效率來說很實用。

項目 中文 說明
Scan count 掃描計數 到達葉 (leaf) 層級後,搜尋 (seek) 或 掃描 (scan) 取得資料的次數,用於建立輸出結果。
logical reads 邏輯讀取 從資料快取讀取的分頁數量。
physical reads 實體讀取 從磁碟中讀取的分頁數量。
read-ahead reads 讀取前讀取 為了本次查詢,將資料放入快取的分頁數量。
lob logical reads LOB 邏輯讀取 從資料快取讀取的 LOB 分頁數量。
lob physical reads LOB 實體讀取 從磁碟中讀取的 LOB 分頁數量。
lob read-ahead reads LOB 讀取前讀取 為了本次查詢,將資料放入快取的 LOB 分頁數量。
  • 分頁:SQL 資料儲存的基本單位。
  • LOB:Large OBject 的縮寫,表示可以存放大量內容的資料類型,包含 TEXTNTEXT, IMAGEVARCHAR(MAX)NVARCHAR(MAX)VARBINARY(MAX) 等。
  • 掃描計數的次數:使用 Unique Index 或 Clustered Index 查詢主鍵 (Primary Key),而且只搜尋一個值的狀況,為 0;在 Non-Clustered Index 上搜尋一個值時,為 1;在葉層級找到索引鍵值,開始向左、右掃描的次數,為 N。

掃描計數、邏輯讀取等統計資訊

參考資料

SET STATISTICS TIME ON

可以顯示當次執行語法的 CPU 計算時間 / 查詢時間。

項目 中文 說明
CPU Time CPU 時間 CPU 查詢資料的時間
Elapsed Time 經過時間 查詢完成的時間,包含 CPU 時間,以及 IO、延遲、鎖定等其它耗費的時間
  •  若經過時間 < CPU 時間,是因為有多個 CPU 核心平行查詢造成的。

經過時間、CPU 時間

參考資料

其它的 SET 陳述式

陳述式 說明 好文參考
SET ANSI_NULLS ON 可以用來設定查詢條件使用 =  和 <>  比較 NULL 時,比較的結果為何。 SET ANSI_NULLS (Transact-SQL) - SQL Server - Microsoft Learn
SET QUOTED_IDENTIFIER ON 可以決定要不要使用 ”  雙引號作為字串邊界。 [SQL SERVER]善用 QUOTED_IDENTIFIER - RiCo技術農場 - 點部落
SET NOCOUNT ON 可以不顯示「N 筆資料列受到影響」,節省一點點網路流量。 德瑞克:SQL Server 學習筆記: 減少網路傳輸量,進而提升效能,以設定 SET NOCOUNT ON 不要回傳所影響的資料列筆數之訊息為例