比較sql查詢效能 語句
--優先使用set statistics io和set statistics time檢視效能調節是否有效。
--set statistics time on
--set statistics time on
在開始我們的例子前,先執行下面的這二條命令(不要在正在使用的伺服器上執行),
這二條命令將清除sql server的資料和過程緩衝區,這樣能夠使我們在每次執行查詢時在同乙個起點上,否則,每次執行查詢得到的結果就不具有可比性了:
dbcc dropcleanbuffers
dbcc freeproccache
set statistics time on
select sum(totalamount)sumat,tenderno from if_middle_test --your sql
set statistics time off
結果對比:
-- cpu 時間 = 1560 毫秒,占用時間 = 7229 毫秒。
--todaydateindex:cpu 時間 = 1435 毫秒,占用時間 = 10340 毫秒。
--shonoindex: cpu 時間 = 1606 毫秒,占用時間 = 7918 毫秒。
--***both index***: cpu 時間 = 1295 毫秒,占用時間 = 2624 毫秒。
由於cpu占用時間是相對穩定的,因此可以使用這一資料作為衡量你的調節措施是提高了查詢效能還是降低了查詢的效能的一種方法。
set statistics io的輸出資訊顯示在輸出的結束處,下面是它顯示的乙個例子:
table 'order details'. scan count 1, logical reads 10, physical reads 1, read-ahead reads 9.
scan count:在查詢中涉及到的表被訪問的次數。在我們的例子中,其中的表只被訪問了1次,由於查詢中不包括連線命令,這一資訊並不是十分有用,但如果查詢中包含有乙個或多個連線,則這一資訊是十分有用的。
logical reads:這是set statistics io或set statistics time命令提供的最有用的資料。我們知道,sql server在可以對任何資料進行操作前,必須首先把資料讀取到其資料緩衝區中。此外,我們也知道sql server何時會從資料緩衝區中讀取資料,並把資料讀取到大小為8k位元組的頁中。
那麼logical reads的意義是什麼呢?logical reads是指sql server為得到查詢中的結果而必須從資料緩衝區讀取的頁數。在執行查詢時,sql server不會讀取比實際需求多或少的資料,因此,當在相同的資料集上執行同乙個查詢,得到的logical reads的數字總是相同的。
為什麼說在調節查詢效能中知道sql server執行查詢時的logical reads值是很重要的呢?因為在每次執行同一查詢時,這個數值是不會變化的。因此,在進行查詢效能的調節時,這是乙個可以用來衡量你的調節措施是否成功的乙個很好的標準。
在對查詢的效能進行調節時,如果logical reads值下降,就表明查詢使用的伺服器資源減少,查詢的效能有所提高。如果logical reads值增加,則表示調節措施降低了查詢的效能。在其他條件不變的情況下,乙個查詢使用的邏輯讀越少,其效率就越高,查詢的速度就越快。
physical reads:
物理讀指的是,在執行真正的查詢操作前,sql server必須從磁碟上向資料緩衝區中讀取它所需要的資料。在sql server開始執行查詢前,它要作的第一件事就是檢查它所需要的資料是否在資料緩衝區中,如果在,就從中讀取,如果不在,sql server必須首先將它需要的資料從磁碟上讀到資料緩衝區中。
我們可以想象得到,sql server在執行物理讀時比執行邏輯讀需要更多的伺服器資源。因此,在理想情況下,我們應當盡量避免物理讀操作。
情況確實是這樣,sql server在執行查詢時所需要的物理讀次數不可能通過效能調節而減少的。減少物理讀的次數是dba的一項重要工作,但它涉及到整個伺服器效能的調節,而不僅僅是查詢效能的調節。在進行查詢效能調節時,我們不能控制資料緩衝區的大小或伺服器的忙碌程度以及完成查詢所需要的資料是在資料緩衝區中還是在磁碟上,唯一我們能夠控制的資料是得到查詢結果所需要執行的邏輯讀的次數。
小結:
在對查詢的效能進行調節時用一些科學的標準來測量你的調節措施是否有效是十分重要的。問題是,sql servers的負載是動態變化的,使用查詢總的執行時間來衡量你正在調節效能的查詢的效能是提高了還是沒有,並不是乙個合理的方法。
更好的方法是比較多個資料,例如邏輯讀的次數或者查詢所使用的cpu時間。因此在對查詢的效能進行調節時,需要首先使用set statistics io和set statistics time命令向你提供一些必要的資料,以便確定你對查詢效能進行調節的措施是否真正地得到了目的。
其他相關:
set statistics io on
set statistics profile on
set statistics io off
set statistics profile off
SQL語句的效能查詢
本文 對於做管理系統和分析系統的程式設計師,複雜sql語句是不可避免的,面對海量資料,有時候經過優化的某一條語句,可以提高執行效率和整體執行效能。如何選擇sql語句,本文提供了兩種方法,分別對多條sql進行量化的分析。在測試sql效能的過程中。一是通過設定statistics檢視執行sql時的系統情...
如何查詢效能最差的SQL語句
總耗時最長 select top 10 total worker time 1000 as n 總消耗cpu 時間 ms execution count n 執行次數 qs.total worker time qs.execution count 1000 as n 平均消耗cpu 時間 ms la...
如何查詢效能最差的SQL語句
總耗時最長 select top 10 total worker time 1000 as n 總消耗cpu 時間 ms execution count n 執行次數 qs.total worker time qs.execution count 1000 as n 平均消耗cpu 時間 ms la...