2014-06-16 66 views
4

是否有比使用分析器更簡單的方法來測量MS-SQL中的SQL性能?在不使用分析器的情況下測量SQL性能

我一直在使用這個腳本,我在互聯網上找到它,它給了我測量,但我不知道它可能有多準確。

DECLARE @StartTime datetime; 

DBCC DROPCLEANBUFFERS -- Force data/index pages out of buffer cache for valid test 
SET @StartTime = GETDATE() -- Measurement Starts 

-->Insert SQL CALL/Script here 

-- Measurement Ends 
SELECT ExecutionTimeInMS = DATEDIFF(millisecond, @StartTime, getdate()) 
GO 

在我正在做出的選擇中,是否有類似的替代方法來獲得快速和骯髒的,一般準確的脈衝?

它已經返回了一些令人驚訝的結果,但是在測試查詢或測試工具/腳本中,我沒有在哪裏引導驚喜?

+1

這哪裏是'interwebs'? –

+1

分析器,執行計劃,統計時間和io。這些是使用的工具。一遍又一遍地遞減緩衝會給你很糟糕的指標。 –

+0

是的,這適用於單個查詢或過程的基準響應時間和資源消耗的基準測試。這在調整單個查詢時效果最佳,以迭代方式將其與自身的以前版本進行比較。這對於查看整個服務器/應用程序性能(近乎無用)來說並不是那麼好。 – RBarryYoung

回答

0

在刪除緩衝區之前,您應設置checkpoint以強制所有髒頁面到磁盤。 無論如何,在測試系統中播放時,放置緩衝區可能是一個選擇。 SQL查詢的性能很大程度上取決於數據庫中的數據以及在該數據庫上運行的查詢的類型,頻率,參數和結果集。

在「乾淨的」單用戶系統上運行查詢產生乾淨的單用戶系統的結果。緩衝區管理是DBMS的核心功能,所以我沒有看到任意刷新緩衝區和測量執行時間值的一個要點。另外,在生產系統上這樣做可能會降低總體性能,因此也會影響查詢。

要優化單個查詢,請使用執行計劃並確定佔最高份額的查詢部分,並查看您是否可以對其執行任何操作。例如,如果你的設計索引不合適你的數據,那麼執行時間就意味着什麼,但執行計劃會給你一個提示。

爲了確定值得優化的查詢,使用探查器查找a)消耗資源的查詢(例如長時間運行)和b)經常使用的查詢。

要監視整個系統,請使用性能計數器,並關注內存和I/O子系統,例如,尋呼計數器。

+0

我正在尋找一個快速和骯髒的測試來演示查詢的速度。如果我正在教一個19名學生的課,那麼19個運行剖析器的人不會把整個系統帶到膝蓋上嗎?你如何快速演示where id =(select_id from other_table)是一個壞主意? – discosammy

+0

我明白了,我明白了,我之前也有類似的問題。我試圖解釋的是,沒有簡單的指標可以使用。你可以衡量執行時間,但你對這個值做了什麼?你不能去找另一個開發者,並告訴他「嘿5毫秒太慢了,應該是2毫秒」。緩衝區刷新可能對比較不同版本的查詢有用,但即使這樣也不能保證活動框上的結果相同。 –

+0

爲了演示的目的,我認爲相當好。但正如我所說,我只會在測試環境中演示。 –

2

這裏是我的測試設置:

DBCC DROPCLEANBUFFERS 
DBCC freeproccache 

SET STATISTICS IO ON 
SET STATISTICS TIME ON 

SELECT * FROM sys.all_columns 

,給你不錯的輸出(信息選項卡):

(4307 row(s) affected) 
Table 'syscolrdb'. Scan count 1, logical reads 167, physical reads 0, read-ahead reads 167, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'syscolpars'. Scan count 1, logical reads 12, physical reads 1, read-ahead reads 10, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 78 ms, elapsed time = 738 ms. 
+0

這是從客戶端窗口完成此操作的好方法。正如其他人指出的那樣,理解你的環境總是很重要的 - 確保你在系統上測試儘可能類似於最終的系統。但所有這一切都明白,SET STATISTICS TIME ON是一種很好的轉儲時間的方法。它爲每個主要操作和整個時間批次提供了一個時間(第一次嘗試時會有點混淆)......如果可能,一個相關的技巧是在每個步驟中將「打印」語句放入批處理中,然後這些將在時代旁邊顯示。 –

+0

另外'SET STATISTICS IO ON'是快速,骯髒的方式來找出你查詢的東西是錯誤的。示例http://stackoverflow.com/questions/15365367/how-to-replace-a-functional-many-outer-apply-select-from如果數據量已知,我們將看到,在第一個解決方案中太多從表中讀取。 – Tomasito

相關問題