1.前言 緩存
對於優化SQL語句或存儲過程,之前主要是用以下語句來判斷具體執行時間,可是SQL環境是複雜多變的,下面語句並不能精準判斷性能是否提升;若是須要精確知道CPU、IO等信息,就無能爲力了。服務器
PRINT convert(varchar(30),getdate(),121) select * from Sales.SalesOrderDetail where SalesOrderID > 64185 PRINT convert(varchar(30),getdate(),121)
這時候若是使用SET STATISTICS TIME ON和SET STATISTICS IO ON 指令就能清楚的知道了,在測試以前需執行下面2條命令性能
DBCC DROPCLEANBUFFERS 清除緩衝區測試
DBCC FREEPROCCACHE 刪除計劃高速緩存中的元素優化
2.測試spa
2.1 首先執行下面腳本code
--開啓統計信息 SET STATISTICS TIME ON SET STATISTICS IO ON GO select * from Sales.SalesOrderDetail where SalesOrderID > 64185 GO
結果以下blog
--1. SQL Server 分析和編譯時間: CPU 時間 = 0 毫秒,佔用時間 = 53 毫秒。 --2. SQL Server 分析和編譯時間: CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。 (35292 行受影響) --3. 表 'SalesOrderDetail'。掃描計數 1,邏輯讀取 337 次,物理讀取 4 次,預讀 333 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。 --4. SQL Server 執行時間: CPU 時間 = 47 毫秒,佔用時間 = 893 毫秒。
說明:資源
標記1:表示將語句的結果放到SQL緩衝區所須要的CPU時間和總時間get
標記2:標識從緩衝區中取出解析結果所須要的時間
標記4:標識此次查詢使用了多少CPU時間和總的時間,其中CPU時間是對查詢所需CPU資源的一種比較穩定的測量方式;總時間則跟SQL服務器有關,所以比較不穩定;因此性能判斷的時候能夠以CPU時間來作標準。
標記3:資源時間;其中邏輯讀是指SQL從緩衝區讀取的數據;物理讀是指從數據從磁盤讀取到緩衝區中;
2.2 再次運行查詢語句結果以下,因爲第一次執行的時候,數據已經從磁盤讀取到緩衝區,所以標記1的時間也就是0了,標記3物理讀也爲0了。
--1. SQL Server 分析和編譯時間: CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。 --2. SQL Server 分析和編譯時間: CPU 時間 = 0 毫秒,佔用時間 = 0 毫秒。 (35292 行受影響) --3. 表 'SalesOrderDetail'。掃描計數 1,邏輯讀取 337 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。 --4. SQL Server 執行時間: CPU 時間 = 32 毫秒,佔用時間 = 848 毫秒。
2.3 在優化SQL語句的時候能夠從CPU時間,邏輯讀取數來判斷性能是否提高,並且這2個指標是比較真實的反映了SQL執行狀況的。這裏只是簡單介紹了一下這2個命令的一些基本信息,則需更加深刻了解SQL底層知識。