邏輯與實體運算子參考
運算子說明 SQL Server 如何執行查詢或資料操作語言 (DML) 陳述式。查詢最佳化工具會使用運算子來建立查詢計畫,以便建立查詢所指定的結果,或執行 DML 陳述式所指定的作業。查詢計畫是由實體運算子所組成的樹狀結構。
運算子可分為邏輯與實體運算子兩種。邏輯運算子說明概念層級的關聯式查詢處理作業。實體運算子則使用具體方法或演算法,實際實作邏輯運算子所定義的作業。例如,"join" 是邏輯作業,而 "nested loops joins" 則是實體運算子。
邏輯運算子
邏輯運算子說明用來處理陳述式的關聯式代數作業。換句話說,邏輯運算子可就概念上說明需要執行哪項作業。實體運算子
實體運算子會實作邏輯運算子所描述的作業。每個實體運算子都是執行作業的物件或常式。例如,有些實體運算子會從資料表、索引或檢視中存取資料行或資料列。其他實體運算子則會執行其他類型的作業:彙總運算子會計算內含 MIN、MAX、SUM、COUNT 或 AVG 的運算式,而合併聯結運算子則會執行不同類型的邏輯聯結作業。實體運算子可進行初始化、收集資料及關閉。特別是,實體運算子可回應下列三種方法呼叫:
Init():Init() 方法會使實體運算子自行初始化,並設定任何必要的資料結構。實體運算子可接收許多 Init() 呼叫,但通常實體運算子只會接收一個。
GetNext():GetNext() 方法會使實體運算子取得資料的第一個或下一個資料列。實體運算子可能會接收零個或許多 GetNext() 呼叫。
Close():Close() 方法會使實體運算子執行某些清除作業並自行關閉。實體運算子只會接收一個 Close() 呼叫。
GetNext() 方法會傳回一列資料,而它被呼叫的次數會在使用 SET STATISTICS PROFILE ON or SET STATISTICS XML ON 所產生的「執行程序表」輸出中顯示為 ActualRows。如需有關這些 SET 選項的詳細資訊,請參閱<SET STATISTICS PROFILE (Transact-SQL)>和<SET STATISTICS XML (Transact-SQL)>。
「執行程序表」輸出中顯示的 ActualRebinds 和 ActualRewinds 計數代表 Init() 方法被呼叫的次數。除非運算子位於迴圈聯結的內部,否則 ActualRebinds 會等於 1,而 ActualRewinds 會等於零。如果運算子位於迴圈聯結的內部,重新繫結和倒轉數目的總和應該會等於聯結外部所處理的資料列數目。重新繫結是指聯結中有一或多個相互關聯的參數發生變更,而必須重新評估內部。倒轉是指相互關聯的參數沒有發生變更,先前的內部結果集可供重複使用。
ActualRebinds 和 ActualRewinds 會顯示在使用 SET STATISTICS XML ON 產生的「XML 執行程序表」輸出中。他們只會填入 「非叢集索引多工緩衝處理」、「選端查詢」、「資料列計數多工緩衝處理」、「排序」、「資料表多工緩衝處理」 以及 「資料表值函數」 運算子中。當 StartupExpression 屬性設為 TRUE 時,ActualRebinds 和 ActualRewinds 也會填入 「判斷」 和 「篩選」 運算子。
「XML 執行程序表」中有 ActualRebinds 和 ActualRewinds 時,您可將它們與 EstimateRebinds 和 EstimateRewinds 做比較。如果沒有,則可將估計的資料列數目 (EstimateRows) 和實際資料列數目 (ActualRows) 做比較。請注意,如果沒有實際重新繫結和實際倒轉,實際圖形「執行程序表」輸出便會顯示零。如需有關圖形「執行程序表」的詳細資訊,請參閱<顯示圖形執行計畫 (SQL Server Management Studio)>。
只有當「執行程序表」輸出是以 SET STATISTICS XML ON 產生時,才可使用相關的計數器 ActualEndOfScans。每當實體運算子存取至其資料流結尾時,此計數器就會累加 1。實體運算子可存取其資料流結尾零次、一次或多次。如同重新繫結和倒轉,只有當運算子位於迴圈聯結內部時,結尾掃描次數才能大於 1。結尾掃描次數應小於或等於重新繫結和倒轉的數目總和。
實體運算子會對應到執行演算法。實體運算子的範例包括 index scan/seek、nested loop join、merge join、hash join/aggregation、stream aggregation 等。實體運算子會有上述項目的相關成本。執行查詢或 DML 陳述式的每個步驟都與實體運算子有關。
對應實體與邏輯運算子
查詢最佳化工具會將查詢計畫建立為由邏輯運算子所組成的樹狀結構。在查詢最佳化工具建立計畫之後,它會為每個邏輯運算子選擇最有效率的實體運算子。查詢最佳化工具會使用以成本為基礎的方法,判斷哪個實體運算子將實作邏輯運算子。
一個邏輯運算子通常可由多個實體運算子實作。不過,在極少數的情況下,實體運算子也可以實作多個邏輯運算子。
本章節內容
本節包含下列邏輯與實體運算子的說明:
|