以下語句可以進行SQL 語句執行時間分析,兩個go之間就是SQL查詢語句
use Work--數據庫名
go
set statistics profile on
set statistics io on
set statistics time on
go
-----(SQL執行語句)
go
set statistics profile off
set statistics io off
set statistics time off
go
運行一次後就可以在查詢結果的信息標籤下看到統計信息
SQL Server 的查詢過程爲根據SQL表中的統計信息分析執行計劃,然後纔是編譯,最後執行。
其中一共用到了三條Statistics相關語句
一、statistics time選項
用於顯示分析、編譯和執行各語句所需的毫秒數。
1、CPU時間和佔用時間:(1)CPU時間是指該句CPU佔用的時間,即語句佔用了多少CPU資源。在多個CPU的系統中,這個CPU時間是所有CPU上時間的總和。與profiler工具和服務器跟蹤選項所提供的CPU值一致
(2)佔用時間是指該語句總共用的時間,包括可能存在的I/O等待時間等。這個與Profiler中的Duration值一致
通常數據需要從磁盤中讀取,還可能遇到I/O阻塞,因此大部分情況下看到的是佔用時間大於CPU時間,這個很容易理解,但有時候CPU時間是可能大於佔用時間的,這是由於該句使用了多個CPU,但是等待時間又很短
那麼個SQL語句的CPU時間就是分析編譯裏的CPU時間加上執行時間裏的CPU時間之和,整個語句的執行時間就是所有佔用時間之和。通常編譯主要就是CPU的運算,那麼CPU時間和佔用時間應該是比較接近的。如果在執行過程,就可能需要將數據從磁盤讀入內存,那麼I/O等待時間的消耗就可能造成佔用時間很長。
2、在存在緩存的情況下,執行計劃可以重用,因此分析編譯時間可能都爲零;執行過程中的數據也不需要從磁盤上讀取,所以執行時間中的中佔用時間很短,緩存使得性能大提高。
二、Statistics IO選項
用於SQL Server 顯示有關由 Transact-SQL 語句生成的磁盤活動量的信息。
1、“表 'ProductLite'。掃描計數 1,邏輯讀取 3077 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。”這條結果中出現的概念在SQL Server幫助文檔中都有解釋
2、邏輯讀取與Profiler中的Reads值是一個概念,但是由於profile日跟蹤顯示的Reads隨着該查詢使用的SET語句而增長,但是Statistics IO顯示的邏輯讀數量不包含SET語句所訪問的附加頁面,因此,Statistics IO提供的讀操作數量一致。
3、當內存中還沒有需要查找的數據時,需要從磁盤讀取,因此物理讀取和預讀都不會爲零;一旦經過一次查詢後,該數值放入緩存,那麼這兩個值將保持爲零。
三、Statistics profiler
顯示語句的配置文件信息。STATISTICS PROFILE 對即席查詢、視圖和存儲過程有效。
參數說明
Rows:執行計劃的每一步返回的實際行數
Executes:執行計劃的每一步被運行了多少次
StmtText:執行計劃的具體內容。執行計劃以一棵樹的形式顯示。每一行都是運行的一步,都會有結果集返回,也都會有自己的cost
EstimateRows:SQLSERVER根據表格上的統計信息,預估的每一步的返回行數。
EstimateIO:SQLSERVER根據EstimateRows和統計信息裏記錄的字段長度,預估的每一步會產生的I/O cost
EstimateCPU:SQLSERVR根據EstimateRows和統計信息裏記錄的字段長度,以及要做的事情的複雜度,預估每一步會產生的CPU cost
TotalSubtreeCost:SQLSERVER根據EstimateIO和EstimateCPU通過某種計算公式,計算出每一步執行計劃子樹的cost
Warnings:警告信息
Parallel:是否使用了並行的執行計劃