SqlSever查詢開銷

2021-09-12 15:51:39 字數 3026 閱讀 9830

儘管查詢的執行計畫提供了詳細的處理策略的單獨步驟涉及的估計相對開銷,但是它沒有提供查詢實際的cpu使用、磁碟讀寫或持續時間等開銷。

還有其他比執行profiler更直接手機效能資料的方法

客戶統計將計算機作為伺服器的乙個客戶端,從這個角度出發去捕捉執行資訊。這意味著任何記錄事件包括通過網路傳送資料的時間,而不僅僅是sql server本身所花費的時間。

要使用客戶統計,只需要單擊=》查詢=》包含客戶統計。

現在,每當執行乙個查詢,就會收集乙個限定的資料集,包括執行事件,影響的行數、到伺服器的往返次數等。進一步,查詢的每次執行在客戶統計選項卡上被分別顯示,有一列將多次的執行進行累加並顯示所收集資料的平均值。該統計也以箭頭方式顯示一次執行和下次執行之間事件或計數是否改變。

執行查詢語句,顯示的客戶端資訊如下:

雖然捕捉客戶統計可能收集資料的有用手段,但這是個有限的資料集,沒有辦法顯示一次執行與另一次的差別。甚至可能執行完全不同的乙個查詢,它的資料可能與其他的混合在一起,從而使平均值失去意義。如果需要這麼做可以重置客戶統計=》查詢=》重置客戶端統計實現。

duration和cpu都代表著查詢的時間因素。要獲得關於解析、編譯和執行查詢的總時間詳細資訊,可以通過set statistics time實現: 

執行時間cpu 時間 = 125毫秒表示profiler工具和伺服器跟蹤選項所提供的cpu值。相似地對應的占用時間 = 1065毫秒表示其他機制提供的duration值。

分析和編譯時間意味著優化器重用這個查詢現有的執行計畫,因此不必花費任何時間來再次解析和編譯時間。如果查詢第一次執行,那麼優化器必須首先解析查詢語法,然後編譯它以生成執行計畫。這個可以呼叫dbcc freeproccache清楚快取,然後重新執行查詢: 

不應該在生產系統上執行dbcc freeproccache,除非準備胡斐無謂的開銷重新編譯系統上的每個查詢,某種程度上,這個系統重啟的開銷相同。

為了減少讀操作總數,發現查詢中訪問的所有表以及對應的讀運算元量是有用的。

要獲得執行查詢所化花費的io可以通過操作gui得到:

查詢=》查詢選項=》設定statistics io: 

當然也可以通過程式設計的方式開啟:

在解讀statistics io輸出時,多半會參考邏輯讀運算元量,有時候也會參考掃瞄計數。但即使每個掃瞄執行很少的邏輯讀,statistics io所提供的邏輯讀總數仍然可能會很高。如果每個掃瞄的邏輯讀數量對於特定的表很小,那麼可能無法進一步地改進該錶的索引機制。物理讀操作和預讀數量在資料無法在記憶體中找到時不為0,但是一旦資料填寫到記憶體,物理讀和預讀將趨近於0。

知道查詢使用的所有表及其對應的讀運算元量還有另乙個好處。sql server機器上執行的重要服務和後台應用通常會影響所觀測的查詢處理時間,duration和cpu值在表結構或資料沒有變化的情況下重新執行相同查詢,結果常常有很大的波動。

在優化各步驟期間,需要乙個沒有被動的開銷數字作為參考。讀運算元量在固定的表結構和資料下的查詢多次執行之間不會有變化。例如,如果執行select語句10次,可能得到10個不同的duration和cpu數值,但reads每次都保持一致。

下面還給出一些常用的計數及清除快取的方法:

操作說明

dbcc dropcleanbuffers

清空資料快取

dbcc freeproccache

清空編譯快取

其他統計操作說明:

選項說明

set nocount

當 set nocount 為 on 時,不返回計數(表示受 transact-sql 語句影響的行數)。當 set nocount 為 off 時,返回計數。

set arithabort

在查詢執行過程中發生溢位或被零除錯誤時終止查詢。

set noexec

編譯但不執行語句

set showplan_text

不執行 transact-sql 語句。但由 sql server 返回有關如何執行語句的詳細資訊。

set parseonly

解析但不編譯或執行語句

set statistics time

統計執行語句所消耗時間

set statistics io

統計執行語句所消耗io

set concat_null_yields_null

控制是將串聯結果視為 null 還是空字串值。on:select 『abc』 + null; 返回null;off:select 『abc』 + null; 返回abc

set transaction isolation level

控制到 sql server 的連線發出的 transact-sql 語句的鎖定行為和行版本控制行為。

set deadlock_priority

指定當前會話與其他會話發生死鎖時繼續處理的相對重要性。

set lock timeout

指定語句等待鎖釋放的毫秒數。

set query_governor_cost_limit

數值或整數值,用於指定可以執行查詢的最長時間。查詢調控器不允許執行估計開銷超過該值的任何查詢。如果指定此選項為 0(預設),將關閉查詢調控器,並且允許所有查詢無限期執行。

關於MySQL中的查詢開銷檢視方法詳解

mysql邏輯架構 如果能在頭腦中構建一幅mysql各元件之間如何協同工作的架構圖,有助於深入理解mysql伺服器。下圖展示了mysql的邏輯架構圖。mysql邏輯架構,來自 高效能mysql mysql邏輯架構整體分為三層,最上層為客戶端層,並非mysql所獨有,諸如 連線處理 授權認證 安全等功...

查詢開放內容

您可以選擇幾種不同的方法從資料庫提取開放內容。使用一種簡單的方法,您就可以通過普通的sql查詢檢索資料 與返回xml的sql查詢正好相反 然後通過使用所選的api將結果處理為xml 如圖1所示 您也可以使用直接返回xml的查詢,在這種情況下,有兩個選擇。乙個選擇是,您可以使用forxmlexplic...

通用查詢開發

通用查詢模組 開發此通用查詢模組的初衷 開發強度降低 不需要重複開發 使用者可以設定自己的查詢方案 自定義查詢方案 開發者可以自定義查詢方式 模組開發原理 根據設定的資料字典 載入資料字典的字段資訊 圖1 設定查詢的邏輯字元 圖2 使用者設定查詢資訊 使用者可以儲存設定的查詢方案 圖6 程式進行sq...