1.前言 對于優(yōu)化SQL語句或存儲過程,以前主要是用如下語句來判斷具體執(zhí)行時間,但是SQL環(huán)境是復雜多變的,下面語句并不能精準判斷性能是否提高;如果需要精確知道CPU、IO等信息,就無能為力了。 1 2 3 | 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 指令就能清楚的知道了,在測試之前需執(zhí)行下面2條命令 DBCC DROPCLEANBUFFERS 清除緩沖區(qū) DBCC FREEPROCCACHE 刪除計劃高速緩存中的元素 2.測試 2.1 首先執(zhí)行下面腳本 1 2 3 4 5 6 7 | --開啟統(tǒng)計信息
SET STATISTICS TIME ON
SET STATISTICS IO ON
GO
select * from Sales.SalesOrderDetail where SalesOrderID > 64185
GO
|
結果如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | --1.
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 53 毫秒。
--2.
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
(35292 行受影響)
--3.
表 'SalesOrderDetail'。掃描計數(shù) 1,邏輯讀取 337 次,物理讀取 4 次,預讀 333 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
--4.
SQL Server 執(zhí)行時間:
CPU 時間 = 47 毫秒,占用時間 = 893 毫秒。
|
說明: 標記1:表示將語句的結果放到SQL緩沖區(qū)所需要的CPU時間和總時間 標記2:標識從緩沖區(qū)中取出解析結果所需要的時間 標記4:標識這次查詢使用了多少CPU時間和總的時間,其中CPU時間是對查詢所需CPU資源的一種比較穩(wěn)定的測量方式;總時間則跟SQL服務器有關,因此比較不穩(wěn)定;所以性能判斷的時候可以以CPU時間來做標準。 標記3:資源時間;其中邏輯讀是指SQL從緩沖區(qū)讀取的數(shù)據(jù);物理讀是指從數(shù)據(jù)從磁盤讀取到緩沖區(qū)中; 2.2 再次運行查詢語句結果如下,由于第一次執(zhí)行的時候,數(shù)據(jù)已經(jīng)從磁盤讀取到緩沖區(qū),因此標記1的時間也就是0了,標記3物理讀也為0了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | --1.
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
--2.
SQL Server 分析和編譯時間:
CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
(35292 行受影響)
--3.
表 'SalesOrderDetail'。掃描計數(shù) 1,邏輯讀取 337 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
--4.
SQL Server 執(zhí)行時間:
CPU 時間 = 32 毫秒,占用時間 = 848 毫秒。
|
2.3 在優(yōu)化SQL語句的時候可以從CPU時間,邏輯讀取數(shù)來判斷性能是否提升,而且這2個指標是比較真實的反映了SQL執(zhí)行情況的。這里只是簡單介紹了一下這2個命令的一些基本信息,則需更加深入了解SQL底層知識。
|