SQL 語句執行時間分析

以下語句可以進行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:是否使用了並行的執行計劃




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章