執行程序邏輯和實體運算子參考

運算子說明 SQL Server 如何執行查詢或資料操作語言 (DML) 陳述式。 查詢最佳化工具會使用運算子來建立查詢計畫,以便建立查詢所指定的結果,或執行 DML 陳述式所指定的作業。 查詢計畫是由實體運算子所組成的樹狀目錄。 您可使用 SQL Server Management Studio 中的圖形執行計畫選項 SET SHOWPLAN 陳述式,以及 SQL Server Profiler Showplan 事件類別,檢視查詢計畫。

運算子可分為邏輯與實體運算子兩種。

  • 邏輯運算子
    邏輯運算子說明用來處理陳述式的關聯式代數作業。 換句話說,邏輯運算子可就概念上說明需要執行哪項作業。

  • 實體運算子
    實體運算子會實作邏輯運算子所描述的作業。 每個實體運算子都是執行作業的物件或常式。 例如,有些實體運算子會從資料表、索引或檢視表中存取資料行或資料列。 其他實體運算子則會執行其他操作,如計算、彙總、資料完整性檢查或聯結。 實體運算子會有上述項目的相關成本。

    實體運算子可進行初始化、收集資料及關閉。 特別是,實體運算子可回應下列三種方法呼叫:

    • 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)>。

    「執行程序表」輸出中顯示的 ActualRebindsActualRewinds 計數代表 Init() 方法被呼叫的次數。 除非運算子位於迴圈聯結的內部,否則 ActualRebinds 會等於 1,而 ActualRewinds 會等於零。 如果運算子位於迴圈聯結的內部,重新繫結和倒轉數目的總和應該會等於聯結外部所處理的資料列數目。 重新繫結是指聯結中有一或多個相互關聯的參數發生變更,而必須重新評估內部。 倒轉是指相互關聯的參數沒有發生變更,先前的內部結果集可供重複使用。

    ActualRebindsActualRewinds 會顯示在使用 SET STATISTICS XML ON 產生的「XML 執行程序表」輸出中。 他們只會填入 「非叢集索引多工緩衝處理」「選端查詢」「資料列計數多工緩衝處理」「排序」「資料表多工緩衝處理」 以及 「資料表值函式」 運算子中。 當 StartupExpression 屬性設為 TRUE 時,ActualRebindsActualRewinds 也會填入 「判斷」「篩選」 運算子。

    「XML 執行程序表」中有 ActualRebindsActualRewinds 時,您可將它們與 EstimateRebindsEstimateRewinds 做比較。 如果沒有,則可將估計的資料列數目 (EstimateRows) 和實際資料列數目 (ActualRows) 做比較。 請注意,如果沒有實際重新繫結和實際倒轉,實際圖形「執行程序表」輸出便會顯示零。

    只有當「執行程序表」輸出是以 SET STATISTICS XML ON 產生時,才可使用相關的計數器 ActualEndOfScans。 每當實體運算子存取至其資料流結尾時,此計數器就會累加 1。 實體運算子可存取其資料流結尾零次、一次或多次。 如同重新繫結和倒轉,只有當運算子位於迴圈聯結內部時,結尾掃描次數才能大於 1。 結尾掃描次數應小於或等於重新繫結和倒轉的數目總和。

對應實體與邏輯運算子

查詢最佳化工具會將查詢計畫建立為由邏輯運算子所組成的樹狀目錄。 在查詢最佳化工具建立計畫之後,它會為每個邏輯運算子選擇最有效率的實體運算子。 查詢最佳化工具會使用以成本為基礎的方法,判斷哪個實體運算子將實作邏輯運算子。

一個邏輯運算子通常可由多個實體運算子實作。 不過,在極少數的情況下,實體運算子也可以實作多個邏輯運算子。

運算子描述

本節包含邏輯與實體運算子的說明:

圖形執行計畫圖示

Showplan 運算子

說明

Aggregate

Aggregate 運算子會計算包含 MIN、MAX、SUM、COUNT 或 AVG 的運算式。 Aggregate 運算子可以是邏輯運算子或實體運算子。

算術運算式運算子圖示

Arithmetic Expression

Arithmetic Expression 運算子會從資料列中現有的值計算出新的值。 Arithmetic Expression 無法用於 SQL Server 2012 中。

判斷提示運算子圖示

Assert

Assert 運算子會驗證條件。 例如,它會驗證參考完整性,或確定純量子查詢傳回一個資料列。 Assert 運算子會針對每個輸入資料列來評估執行計畫之 Argument 資料行中的運算式。 如果這個運算式評估為 NULL,代表資料列通過 Assert 運算子的驗證,則查詢會繼續執行。 如果這個運算式得出非 Null 值,就會得出相對的錯誤。 Assert 運算子是實體運算子。

指定語言元素圖示

Assign

Assign 運算子會將運算式的值或常數指派給變數。 Assign 是語言元素。

Asnyc Concat

Asnyc Concat 運算子只能使用於遠端查詢 (分散式查詢)。 它有 n 個子節點和一個父節點。 一般來說,某些子節點是參與分散式查詢的遠端電腦。 Asnyc Concat 會同時對所有子節點發出 open() 呼叫,然後再將點陣圖套用到每個子節點。 Async Concat 會針對每一個是 1 的位元,視需要將輸出資料列傳送至父節點。

點陣圖運算子圖示

Bitmap

SQL Server 會使用 Bitmap 運算子,實作平行查詢計畫中的點陣圖篩選。 點陣圖篩選可透過消除其索引鍵值無法產生任何聯結記錄的資料列,加速查詢的執行,然後再透過另一個運算子 (如 Parallelism 運算子) 傳遞資料列。 點陣圖篩選會於運算子樹狀目錄的一部分,以精簡方式顯示資料表中的一組值,以便從此樹狀目錄的另一個部分篩選第二個資料表中的資料列。 藉由盡早移除查詢中不必要的資料列,後續的運算子需要處理的資料列就較少,而查詢的整體效能也會提升。最佳化工具會判斷點陣圖何時具有足夠的選擇性,能夠充分運用以及將篩選套用到哪個運算子。 Bitmap 是實體運算子。

點陣圖運算子圖示

Bitmap Create

Bitmap Create 運算子會出現在建立點陣圖的 Showplan 輸出中。 Bitmap Create 是邏輯運算子。

書籤查閱運算子圖示

Bookmark Lookup

Bookmark Lookup 運算子使用書籤 (資料列識別碼或叢集索引鍵) 在資料表或叢集索引中查閱對應的資料列。 Argument 資料行中包含用來在資料表或叢集索引中查詢資料列的書籤標記。 Argument 資料行中也包含查詢資料列的資料表或叢集索引的名稱。 如果 Argument 資料行中出現 WITH PREFETCH 子句,表示查詢處理器已決定在資料表或叢集索引中查詢書籤時,使用非同步預先提取 (預先讀取) 是最佳方法。

Bookmark Lookup 無法用於 SQL Server 2012 中。 不過,Clustered Index Seek 和 RID Lookup 會提供書籤查閱功能。 Key Lookup 運算子也提供這項功能。

Branch Repartition

在平行查詢計畫中,有時候會有 Iterator 的概念區。 在這種區域內的所有 Iterator,都可以由平行執行緒來執行。 區域本身必須連續執行。 個別區域內的一些 Parallelism Iterator,稱為 Branch Repartition。 在兩個這種區域的界限上的 Parallelism Iterator,稱為 Segment Repartition。 Branch Repartition 和 Segment Repartition 是邏輯運算子。

Broadcast

Broadcast 有一個子節點及 n 個父節點。 Broadcast 會依要求將其輸入資料列傳送至多位取用者。 每位取用者都會收到所有資料列。 例如,若所有取用者都是雜湊聯結的建立者,即會建立 n 份雜湊資料表。

建立雜湊運算子圖示

Build Hash

指示建立 xVelocity 記憶體最佳化的資料行存放區索引之批次雜湊資料表。

Cache

Cache 是特殊版的 Spool 運算子。 它只儲存一列資料。 Cache 是邏輯運算子。 Cache 無法用於 SQL Server 2012 中。

叢集索引刪除運算子圖示

Clustered Index Delete

Clustered Index Delete 運算子會從查詢執行計畫之 Argument 資料行所指定的叢集索引中,刪除資料列。 如果 Argument 資料行中出現 WHERE:() 述詞,就只會刪除滿足述詞的資料列。Clustered Index Delete 是實體運算子。

叢集索引插入運算子圖示

Clustered Index Insert

Clustered Index Insert Showplan 運算子會將其輸入的資料列插入 Argument 資料行所指定的叢集索引中。 Argument 資料行也包含 SET:() 述詞,指出每一個資料行設定的值。 如果 Clustered Index Insert 沒有插入值的子系,則會從 Insert 運算子本身取得插入的資料列。Clustered Index Insert 是實體運算子。

叢集索引合併運算子

叢集索引合併

Clustered Index Merge 運算子會將合併資料流套用到叢集索引。 此運算子會從運算子之 Argument 資料行內所指定的叢集索引中刪除、更新或插入資料列。 所執行的實際作業取決於運算子之 Argument 資料行內指定之 ACTION 資料行的執行階段值。 Clustered Index Merge 是實體運算子。

叢集索引掃描運算子圖示

Clustered Index Scan

Clustered Index Scan運算子會掃描查詢執行計畫之 Argument 資料行中指定的叢集索引。 出現選擇性的 WHERE:() 述詞時,只會傳回滿足述詞的資料列。 如果 Argument 資料行中包含 ORDERED 子句,表示查詢處理器要求資料列的輸出須按叢集索引的排序次序傳回。 如果沒有 ORDERED 子句,儲存引擎會以最佳方式搜尋索引,而不需要排序輸出。 Clustered Index Scan 是邏輯與實體運算子。

叢集索引搜尋運算子圖示

Clustered Index Seek

Clustered Index Seek 運算子使用索引的搜尋能力,從叢集索引中擷取資料列。 Argument 資料行包含所使用的叢集索引名稱,及 SEEK:() 述詞。 儲存引擎會使用索引來處理滿足這個 SEEK:() 述詞的資料列。 也可以包含 WHERE:() 述詞,讓儲存引擎針對滿足 SEEK:() 述詞的所有資料列進行評估,但此為選擇性,且不使用索引來完成此程序。

如果 Argument 行中包含 ORDERED 子句,表示查詢處理器已決定,資料列的傳回順序必須依叢集索引的排序次序。 如果沒有 ORDERED 子句,儲存引擎會以最佳方式搜尋索引,不需要將輸出排序。 讓輸出維持次序會比產生不按次序的輸出更沒效率。 出現關鍵字 LOOKUP 時,表示正在執行書籤查閱。 在 SQL Server 2008 和更新版本中,Key Lookup 運算子會提供書籤查閱功能。 Clustered Index Seek 是邏輯與實體運算子。

叢集索引更新運算子圖示

Clustered Index Update

Clustered Index Update 運算子會更新 Argument 資料行中所指定之叢集索引內的輸入資料列。如果出現 WHERE:() 述詞,就只會更新滿足這個述詞的資料列。 如果出現 SET:() 述詞,則每個更新的資料行都會設為這個值。 如果出現 DEFINE:() 述詞,就會列出這個運算子定義的數值。 在 SET 子句中或這個運算子中以及這個查詢中的其他位置,都可以參考這些數值。 Clustered Index Update 是邏輯與實體運算子。

摺疊運算子圖示

Collapse

Collapse 運算子可最佳化更新處理。 執行更新時,它可以分割成 (使用 Split 運算子) 刪除與插入。 Argument 資料行包含指定索引鍵資料行清單的 GROUP BY:() 子句。 如果查詢處理器發現了刪除及插入相同索引鍵值的相鄰資料列,會以更有效率的單一更新作業來取代這些不同的作業。 Collapse 是邏輯與實體運算子。

資料行存放區索引掃描

Columnstore Index Scan

Columnstore Index Scan 運算子會掃描查詢執行計畫之 Argument 資料行中所指定的資料行存放區索引。

計算純量運算子圖示

計算純量

Compute Scalar 運算子會評估運算式,以產生計算的純量值。 然後可能會將此值傳回給使用者,或由查詢的其他地方來參考,或兩者皆是。 例如在篩選述詞或聯結述詞中,就會見到這兩種情況。 計算純量是邏輯與實體運算子。

執行程序表中出現的計算純量運算子可能不會包含 RunTimeInformation 項目。 在圖形化的執行程序表中,當選取 SQL Server Management Studio 中的 [包括實際執行計畫] 選項時,[實際資料列][實際重新繫結][實際倒轉] 可能不會顯示在 [屬性] 視窗中。 發生此情況時,表示這些運算子雖然用於編譯的執行計畫中,它們的作用是由即時查詢計畫中的其他運算子執行。 同時也請注意,由 SET STATISTICS PROFILE 產生的「執行程序表」輸出中的執行數目,等於由 SET STATISTICS XML 產生的「執行程序表」中重新繫結和倒轉的總和。

串連運算子圖示

串連

Concatenation 運算子會掃描多個輸入,並傳回每一個掃描的資料列。 Concatenation 通常用來實作 Transact-SQL UNION ALL 建構。 Concatenation 實體運算子有兩個以上的輸入和一個輸出。 串連作業會將資料列從第一個輸入資料流複製到輸出資料流,再對其他每一個輸入資料流重複此作業。 Concatenation 是邏輯與實體運算子。

固定掃描運算子圖示

固定掃描

Constant Scan 運算子會在查詢中加入固定的一列或多列。 Compute Scalar 運算子通常用於 Constant Scan 之後,可以將資料行加入由 Constant Scan 運算子所產生的資料列。

轉換 (Database Engine) 語言元素圖示

Convert

Convert 運算子可將某個純量資料類型轉換為另一個資料類型。 Convert 是語言元素。

Cross Join

Cross Join 運算子會將第一個 (頂端) 輸入的每一列與第二個 (底部) 輸入的每一列相聯結。 Cross Join 是邏輯運算子。

資料指標 Catchall 資料指標運算子圖示

catchall

產生圖形執行程序表的邏輯若找不到適當的 Iterator 圖示,就會顯示 [雜物箱] 圖示。 [雜物箱] 圖示不一定會指出錯誤條件。 [雜物箱] 圖示有三種:藍色 (Iterator)、橙色 (資料指標) 與綠色 (Transact-SQL 語言項目)。

資料指標

Cursor 邏輯與實體運算子可用來說明與資料指標作業有關的查詢或更新將如何執行。 實體運算子是說明用來處理資料指標的實體實作演算法,例如使用索引鍵集衍生資料指標。 資料指標執行的每個步驟都有一個實體運算子。 邏輯運算子會說明資料指標的屬性,如資料指標是唯讀的。

邏輯運算子包括非同步、開放式、主要、唯讀、捲動鎖定及次要與同步。

實體運算子包括動態、提取查詢、索引鍵集、母體擴展查詢、重新整理查詢與快照集。

宣告語言項目圖示

宣告

Declare 運算子會在查詢計畫中配置區域變數。 Declare 是語言元素。

刪除 (Database Engine) 運算子圖示

Delete

會從滿足 Argument 資料行之選擇性述詞的物件資料列,刪除 Delete 運算子。

刪除掃描運算子圖示

Deleted Scan

Deleted Scan 運算子會掃描觸發程序中已刪除的資料表。

Distinct

Distinct 運算子可從資料列集或從值集合移除重複的項目。 Distinct 是邏輯運算子。

相異排序

Distinct Sort 邏輯運算子會掃描輸入,移除重複項,並依 Argument 資料行中 DISTINCT ORDER BY:() 述詞所指定的資料行排序。 Distinct Sort 是邏輯運算子。

散發資料流平行處理原則運算子圖示

散發資料流

Distribute Streams 運算子只用於平行查詢計畫。 Distribute Streams 運算子會採用記錄的單一輸入資料流,並產生多個輸出資料流。 記錄內容與格式不會變更。 輸入資料流中的每筆資料錄都會出現在一個輸出資料流中。 這個運算子會自動在輸出資料流中保留輸入資料錄的關聯次序。 通常是利用雜湊方式來決定特定輸入資料錄應屬於哪個輸出資料流。

如果輸出經過分割的話,Argument 資料行中會包含 PARTITION COLUMNS:() 述詞與分割資料行。 Distribute Streams 是邏輯運算子。

動態資料指標運算子圖示

Dynamic

Dynamic 運算子採用的資料指標,可以看到其他人進行的所有變更。

多工緩衝運算子圖示

急切的多工緩衝處理

Eager Spool 運算子會取用整個輸入,將每一列儲存在 tempdb 資料庫的隱藏暫存物件中。 如果倒轉運算子 (例如,利用 Nested Loops 運算子),但是不需要重新繫結,會使用多工緩衝處理資料,而非重新掃描輸入。 如果必須重新繫結的話,就丟棄多工緩衝處理的資料,然後重新掃描 (重新繫結) 輸入以重建多工緩衝處理物件。 Eager Spool 運算子會以「急切的」方式建立多工緩衝處理檔案:當多工緩衝處理的父系運算子要求第一列時,Spool 運算子會消耗其輸入運算子的所有資料列,並將它們儲存在多工緩衝處理中。 Eager Spool 是邏輯運算子。

提取查詢資料指標運算子圖示

Fetch Query

Fetch Query 運算子會在對資料指標發出提取時擷取資料列。

篩選 (Database Engine) 運算子圖示

篩選

Filter 運算子會掃描輸入,只傳回滿足 Argument 資料行中篩選運算式 (述詞) 的資料列。

Flow Distinct

Flow Distinct 邏輯運算子會掃描輸入,移除重複的項目。 Distinct 運算子會在產生任何輸出之前就先取用所有輸入,FlowDistinct 運算子則會每取得一個輸入資料列就傳回一列 (除非該資料列重複,若遇到這種情況,則會將其捨棄)。

Full Outer Join

Full Outer Join 邏輯運算子所傳回的每個資料列,皆滿足第一個 (上方) 輸入的聯結述詞與第二個 (下方) 輸入的每一個資料列相聯結。 它也會傳回以下資料列:

  • 第一個輸入中與第二個輸入完全不符合者。

  • 第二個輸入中與第一個輸入完全不符合者。

不包含相符值的輸入會以 Null 值傳回。 Full Outer Join 是邏輯運算子。

蒐集資料流平行處理原則運算子圖示

蒐集資料流

Gather Streams 運算子僅用於平行查詢計畫中。 Gather Streams 運算子會耗用數個輸入資料流,並將輸入資料流合併而產生記錄的單一輸出資料流。 記錄內容與格式不會變更。 若此運算子要保留順序,那麼所有輸入資料流都必須排序好。 若輸出經過排序,則 Argument 資料行中會包含 ORDER BY:() 述詞,以及要排序的資料行名稱。 Gather Streams 是邏輯運算子。

雜湊比對運算子圖示

Hash Match

Hash Match 運算子會根據其建立的輸入,為每一資料列計算雜湊值,以建立雜湊資料表。 Argument 資料行會出現 HASH:() 述詞,以及用來建立雜湊值的資料行清單。 然後它會為每個探查列 (視情況) 建立雜湊值 (使用相同的雜湊函數),並在雜湊資料表中尋找符合者。 如果出現殘餘述詞 (由 Argument 資料行中的 RESIDUAL:()識別),那麼也必須滿足該述詞,這樣該資料列才算符合。 行為取決於正在執行的邏輯作業:

  • 對於任何聯結,使用第一個 (上方) 輸入來建立雜湊資料表,第二個輸入 (下方) 來探查雜湊資料表。 輸出相符 (或不符合) 由聯結類型規定。 如果多個聯結使用相同的聯結行,這些作業會組成一組成為雜湊群。

  • 對於相異運算子或彙總運算子,使用輸入來建立雜湊資料表 (移除重複項,並計算任何彙總運算式)。 建立雜湊資料表時,會掃描資料表並輸出所有項目。

  • 對於等位運算子,使用第一個輸入來建立雜湊資料表 (移除重複項)。 使用第二個輸入 (必須沒有重複項) 探查雜湊資料表,傳回不符合的所有資料列,然後掃描雜湊資料表,並傳回所有項目。

Hash Match 是實體運算子。

If 語言項目圖示

If

If 運算子會依據運算式執行條件式處理。 If 是語言元素。

Inner Join

Inner Join 邏輯運算子所傳回的每個資料列,皆滿足第一個 (上方) 輸入與第二個 (下方) 輸入的聯結。

插入 (Database Engine) 運算子圖示

Insert

Insert 邏輯運算子會將輸入的每一個資料列,插入 Argument 行中指定的物件。 實體運算子是 Table Insert、Index Insert 或 Clustered Index Insert 運算子。

插入的掃描運算子圖示

插入的掃描

Inserted Scan 運算子會掃描插入的資料表。 Inserted Scan 是邏輯與實體運算子。

內建語言元素圖示

Intrinsic

Intrinsic 運算子會叫用內部 Transact-SQL 函數。 Intrinsic 是語言元素。

Iterator Catchall 運算子圖示

Iterator

產生圖形執行程序表的邏輯若找不到適當的 Iterator 圖示,就會顯示 Iterator 雜物箱圖示。 [雜物箱] 圖示不一定會指出錯誤條件。 [雜物箱] 圖示有三種:藍色 (Iterator)、橙色 (資料指標) 與綠色 (Transact-SQL 語言建構)。

書籤查閱運算子圖示

索引鍵查閱

Key Lookup 運算子可在包含叢集索引的資料行上進行書籤查閱。 Argument 資料行包含叢集索引的名稱和叢集索引鍵,可用來查閱叢集索引中的資料列。 Key Lookup 一律都會伴隨 Nested Loops 運算子。 如果 Argument 資料行中出現 WITH PREFETCH 子句,表示查詢處理器已決定在叢集索引中查詢書籤時,使用非同步預先提取 (預先讀取) 是最佳方法。

在查詢計畫中使用 Key Lookup 運算子,表示查詢可以進行效能微調。 例如,您可以加入涵蓋索引來提高查詢效能。

索引鍵集資料指標運算子圖示

Keyset

Keyset 運算子使用可以查看更新,但無法插入其他人所製作的資料指標。

語言元素 Catchall 圖示

Language Element

產生圖形執行程序表的邏輯若找不到適當的 Iterator 圖示,就會顯示 Language Element 雜物箱圖示。 [雜物箱] 圖示不一定會指出錯誤條件。 [雜物箱] 圖示有三種:藍色 (Iterator)、橙色 (資料指標) 與綠色 (Transact-SQL 語言建構)。

多工緩衝運算子圖示

延遲多工緩衝處理

Lazy Spool 邏輯運算子會將其輸入的每一個資料列,都儲存在 tempdb 資料庫內隱藏的暫存物件中。 如果倒轉運算子 (例如,利用 Nested Loops 運算子),但是不需要重新繫結,會使用多工緩衝處理資料,而非重新掃描輸入。 如果必須重新繫結的話,就丟棄多工緩衝處理的資料,然後重新掃描 (重新繫結) 輸入以重建多工緩衝處理物件。 Lazy Spool 運算子會以「延遲」方式建立它的多工緩衝處理檔案,也就是說,每次多工緩衝處理的父系運算子要求一個資料列時,多工緩衝處理運算子就會從它的輸入運算子取得一個資料列,然後將它儲存在多工緩衝處理內,而不是一次取用所有資料列。 Lazy Spool 是邏輯運算子。

Left Anti Semi Join

當第二個 (下方) 輸入中沒有相符的資料列時,Left Anti Semi Join 運算子將會從第一個 (上方) 輸入傳回每一個資料列。 如果 Argument 資料行中沒有聯結述詞,則每一資料列就是一個符合資料列。 Left Anti Semi Join 是邏輯運算子。

Left Outer Join

Left Outer Join 運算子所傳回的每個資料列,皆滿足第一個 (上方) 輸入與第二個 (下方) 輸入的聯結。 它也會傳回第一個輸入中與第二個輸入完全不相符的任何資料列。 第二個輸入中的不符合資料列會以 null 值傳回。 如果 Argument 資料行中沒有聯結述詞,則每一資料列就是一個符合資料列。 Left Outer Join 是邏輯運算子。

Left Semi Join

當第二個 (下方) 輸入中有相符的資料列時,Left Semi Join 運算子將會從第一個 (上方) 輸入傳回每一個資料列。 如果 Argument 資料行中沒有聯結述詞,則每一資料列就是一個符合資料列。 Left Semi Join 是邏輯運算子。

記錄檔資料列掃描運算子圖示

Log Row Scan

Log Row Scan 運算子會掃描交易記錄。 Log Row Scan 是邏輯與實體運算子。

合併間隔運算子圖示

Merge Interval

Merge Interval 運算子會合併多個 (可能重疊) 間隔以產生最小的非重疊間隔,然後使用這些間隔,尋找索引項目。 這個運算子一般會出現在一個或多個 Compute Scalar 運算子上方,重疊在 Constant Scan 運算子之上,後者會建構這個運算子所合併的間隔 (以資料列中的資料行代表)。Merge Interval 是邏輯和實體運算子。

合併聯結運算子圖示

合併聯結

Merge Join 運算子會執行內部聯結、左方外部聯結、左方半聯結、左方反半聯結、右方外部聯結、右方半聯結、右方反半聯結,以及等位邏輯作業。

Argument 資料行中,若要執行一對多的聯結運算,Merge Join 運算子就要包含 MERGE:() 述詞,若要執行多對多的聯結運算,則要包含 MANY-TO-MANY MERGE:() 述詞。 Argument 行也包含用來執行運算的逗點分隔資料行清單。 Merge Join 運算子需要兩個輸入,依個別資料行排序,可能是利用在查詢計畫中明確地插入排序作業。 如果不需要明確的排序,合併聯結會特別有效;例如,如果資料庫中有合適的 B 型樹狀目錄索引,或如果排序次序可以由多個作業利用 (如合併聯結與含積存的分組功能)。 Merge Join 是實體運算子。

巢狀迴圈運算子圖示

Nested Loops

Nested Loops 運算子執行內部聯結、左方外部聯結、左方半聯結和左方反半聯結邏輯運算。 巢狀迴圈聯結通常使用索引,對內部資料表執行搜尋來尋找外部資料表的每一個資料列。查詢處理器會根據預期的成本,決定是否要排序外部輸入,以改進對內部輸入的索引搜尋位置。 任何滿足 Argument 行中的選擇性述詞的資料列,會根據所執行的邏輯運算而適當地傳回。 Nested Loops 是實體運算子。

非叢集索引刪除運算子圖示

Nonclustered Index Delete

Nonclustered Index Delete 運算子會從 Argument 資料行中指定的非叢集索引,刪除輸入資料列。 Nonclustered Index Delete 是實體運算子。

非叢集索引插入運算子圖示

Index Insert

Index Insert 運算子會將輸入資料列插入 Argument 行所指定的非叢集索引中。 Argument 資料行也包含 SET:() 述詞,指出每一個資料行設定的值。 Index Insert 是實體運算子。

非叢集索引掃描運算子圖示

Index Scan

Index Scan 運算子會擷取 Argument 資料行中所指定之非叢集索引的所有資料列。 如果 Argument 資料行出現選擇性的 WHERE:() 述詞,就只傳回滿足述詞的資料列。 Index Scan 是邏輯與實體運算子。

非叢集索引搜尋運算子圖示

Index Seek

Index Seek 運算子使用索引的搜尋能力,從非叢集索引中擷取資料列。 Argument 行中包含所使用的非叢集索引名稱。 它也包含 SEEK:() 述詞。 儲存引擎會使用索引來處理滿足 SEEK:() 述詞的資料列。 它可以選擇包含 WHERE:() 述詞,讓儲存引擎比對所有滿足 SEEK:() 述詞的資料列 (這麼做時不使用索引)。 如果 Argument 行必須包含 ORDERED 子句,表示查詢處理器已決定傳回的資料列必須依照非叢集索引的排序次序。 如果沒有 ORDERED 子句,儲存引擎會以最適當的方式搜尋索引 (不保證輸出會依序排列)。 讓輸出維持次序會比產生不按次序的輸出還要沒有效率。 Index Seek 是邏輯與實體運算子。

非叢集索引多工緩衝處理運算子圖示

索引多工緩衝處理

Index Spool 實體運算子在 Argument 資料行中包含 SEEK:() 述詞。 Index Spool 運算子會掃描其輸入資料列,將每一列的副本放入隱藏的多工緩衝處理檔中 (儲存在 tempdb 資料庫中,直到查詢結束就不再存在),並對資料列建立非叢集索引。 這讓您可以使用索引的搜尋能力來輸出滿足 SEEK:() 述詞的資料列。 如果倒轉運算子 (例如,利用 Nested Loops 運算子),但是不需要重新繫結,會使用多工緩衝處理資料,而非重新掃描輸入。

非叢集索引更新運算子圖示

Nonclustered Index Update

Nonclustered Index Update 實體運算子會在 Argument 資料行中指定的非叢集索引內,從它的輸入更新資料列。 如果出現 SET:() 述詞,則每個更新的資料行都會設為這個值。 Nonclustered Index Update 是實體運算子。

線上索引插入運算子圖示

線上索引插入

Online Index Insert 實體運算子指出索引之建立、改變或卸除作業將於線上進行。 也就是說,基礎資料表資料在索引操作期間仍然可供使用者使用。

平行處理原則

Parallelism 運算子會執行散發資料流、蒐集資料流及重新分割資料流的邏輯作業。 Argument 資料行可以包含 PARTITION COLUMNS:() 述詞,以及被分割的資料行清單 (以逗點分隔)。 Argument 資料行也可以包含 ORDER BY:() 述詞,用以列出分割期間要保留排序順序的資料行。 Parallelism 是實體運算子。

[!附註]

如果查詢已經編譯為平行查詢,但在執行階段是以序列查詢的方式執行,則由 SET STATISTICS XML 或使用 SQL Server Management Studio 的 [包括實際執行計畫] 選項所產生的「執行程序表」輸出中,將不會包含「平行處理原則」運算子的 RunTimeInformation 元素。 在 SET STATISTICS PROFILE 輸出中,「平行處理原則」運算子的實際資料列計數和實際執行次數會顯示為零。 不論發生的情況為何,都表示「平行處理原則」運算子只用於查詢編譯期間,而不用於執行階段查詢計畫。 請注意,如果伺服器上有大量的並行載入,平行查詢計畫有時會以序列方式執行。

參數資料表掃描運算子圖示

Parameter Table Scan

Parameter Table Scan 運算子會掃描在目前的查詢中當做參數使用的資料表。 一般而言,這是用於預存程序中的 INSERT 查詢。 Parameter Table Scan 是邏輯與實體運算子。

部分彙總

Partial Aggregate 用於平行計畫。 它將彙總函式套用至盡可能最多的輸入資料列,因此不需要寫入磁碟 (稱為「溢出」)。 Hash Match 是唯一可以實作資料分割彙總的實體運算子 (Iterator)。 Partial Aggregate 是邏輯運算子。

母體擴展查詢資料指標運算子圖示

Population Query

Population Query 運算子會在開啟資料指標時,擴展資料指標的工作資料表。

重新整理查詢資料指標運算子圖示

Refresh Query

Refresh Query 運算子會在提取緩衝區中提取資料列目前的資料。

遠端刪除運算子圖示

Remote Delete

Remote Delete 運算子會刪除遠端物件的輸入資料列。 Remote Delete 是邏輯與實體運算子。

遠端索引搜尋 Showplan 運算子

遠端索引掃描

Remote Index Scan 運算子會掃描 Argument 資料行中所指定的遠端索引。 Remote Index Scan 是邏輯與實體運算子。

遠端索引搜尋 Showplan 運算子

遠端索引搜尋

Remote Index Seek 運算子會使用遠端索引物件的搜尋功能來擷取資料列。 Argument 資料行包含所使用的遠端索引名稱及 SEEK:() 述詞。 Remote Index Seek 是邏輯實體運算子。

遠端插入運算子圖示

遠端插入

Remote Insert 運算子會將輸入資料列插入遠端物件。 Remote Insert 是邏輯與實體運算子。

遠端查詢運算子圖示

Remote Query

Remote Query 運算子會對遠端來源送出查詢。 傳給遠端伺服器的查詢文字會出現在 Argument 行中。 Remote Query 是邏輯與實體運算子。

遠端掃描運算子圖示

Remote Scan

Remote Scan 運算子會掃描遠端物件。 遠端物件的名稱會出現在 Argument 行中。 Remote Scan 是邏輯與實體運算子。

遠端更新運算子圖示

Remote Update

Remote Update 運算子會更新遠端物件中的輸入資料列。 Remote Update 是邏輯與實體運算子。

重新分割資料流平行處理原則運算子圖示

重新分割資料流

Repartition Streams 運算子會消耗多個資料流,並產生多個記錄的資料流。 記錄內容與格式不會變更。 如果查詢最佳化工具使用點陣圖篩選,輸出資料流中的資料列數會減少。 輸入資料流的每個資料錄會被放入一個輸出資料流。 如果這個運算子要保留次序,那麼所有輸入資料流都必須排序好,而且合併成數個排序的輸出資料流。 如果輸出經過分割,則 Argument 資料行中會包含 PARTITION COLUMNS:() 述詞與分割資料行。如果輸出經過排序,則 Argument 資料行中會包含 ORDER BY:() 述詞,以及要排序的資料行。 Repartition Streams 是邏輯運算子。 此運算子只用於平行查詢計畫。

結果語言項目圖示

Result

Result 運算子是在查詢計畫結束時所傳回的資料。 這通常是 Showplan 的根元素。 Result 是語言元素。

RID 查閱運算子圖示

RID Lookup

RID Lookup 是堆積上的書籤查閱,它會使用提供的資料列識別碼 (RID)。 Argument 資料行包含書籤標籤,可用以查閱資料表中的資料列,以及已查閱過之資料列的資料表名稱。 RID Lookup 一律都會伴隨 NESTED LOOP JOIN。 RID Lookup 是實體運算子。 如需有關書籤查閱的詳細資訊,請參閱 MSDN SQL Server 部落格中的書籤查閱

Right Anti Semi Join

Right Anti Semi Join 運算子會在第一個 (上方) 輸入中沒有符合資料列存在時,輸出第二個 (下方) 輸入中的每一列。 相符合的資料列定義是滿足 Argument 資料行中述詞的資料列 (如果沒有任何述詞,則每一列都是相符列)。 Right Anti Semi Join 是邏輯運算子。

Right Outer Join

Right Outer Join 運算子所傳回的每個資料列,皆滿足第二個 (下方) 輸入與第一個 (上方) 輸入之每個相符資料列的聯結。 它也會傳回第二個輸入中與第一個輸入完全不相符的任何資料列,以 NULL 相聯結。 如果 Argument 資料行中沒有聯結述詞,則每一資料列就是一個符合資料列。 Right Outer Join 是邏輯運算子。

Right Semi Join

當第一個 (頂端) 輸入有相符的資料列時,Right Semi Join 運算子會從第二個 (底端) 輸入傳回每一個資料列。 如果 Argument 資料行中沒有聯結述詞,則每一資料列就是一個符合資料列。 Right Semi Join 是邏輯運算子。

資料列計數多工緩衝處理運算子圖示

資料列計數多工緩衝處理

Row Count Spool 運算子會掃描輸入、計算共有多少資料列,然後傳回一樣多但不含任何資料的資料列。 如果重點是檢查資料列是否存在,而不是資料列中是否包含資料,就可以使用這個運算子。 例如,如果 Nested Loops 運算子執行左方半聯結作業,而且聯結述詞會套用到內部輸入,就可以在 Nested Loops 運算子的內部輸入上面放 Row Count Spool。 接著,Nested Loops 運算子可以看看 Row Count Spool 會輸出多少資料列 (因為不需要內部的實際資料),決定是否要傳回外部資料列。 Row Count Spool 是實體運算子。

區段運算子圖示

區段

Segment 是實體和邏輯運算子。 它會根據一個或多個資料行的值,將輸入集分割為區段。 這些資料行在 Segment 運算子中會顯示為引數。 然後運算子一次會輸出一個區段。

區段重新分割

在平行查詢計畫中,有時候會有 Iterator 的概念區。 在這種區域內的所有 Iterator,都可以由平行執行緒來執行。 區域本身必須連續執行。 個別區域內的一些平行處理原則 Iterator,稱作「分支重新分割」。 在兩個這種區域的界限上的平行處理原則 Iterator,稱作「區段重新分割Branch RepartitionSegment Repartition 都是邏輯運算子。

順序運算子元件

Sequence

Sequence 運算子會驅動大範圍的更新計畫。 在功能上,它會依序執行每個輸入 (由上而下)。 每個輸入通常是更新不同的物件。 它只會傳回來自最後一個 (下方) 輸入的資料列。 Sequence 是邏輯與實體運算子。

順序專案運算子元件

Sequence Project

Sequence Project 運算子會加入資料行以執行已排序集合的計算。 它會根據一或多個資料行的值,將輸入集分割為區段。 然後運算子一次會輸出一個區段。 這些資料行在 Sequence Project 運算子中會顯示為引數。 Sequence Project 是邏輯與實體運算子。

快照集資料指標運算子圖示

快照集

Snapshot 運算子會建立一個資料指標,而不會看到其他人所做的變更。

排序運算子圖示

排序

Sort 運算子會排序所有內送的資料列。 如果這個作業會移除重複的項目,則 Argument 資料行中會包含 DISTINCT ORDER BY:() 述詞,或包含 ORDER BY:() 述詞以及將會排序的資料行清單 (以逗號分隔)。 如果將資料行依遞增順序排序,資料行前會加上 ASC 值,如果將資料行依遞減順序排序,資料行前會加上 DESC 值。 Sort 是邏輯與實體運算子。

分割運算子圖示

分割

Split 運算子可用以最佳化更新處理。 它會將每個更新分割成一個刪除和一個插入作業。 Split 是邏輯與實體運算子。

多工緩衝運算子圖示

多工緩衝處理

Spool 運算子會將中繼查詢結果儲存至 tempdb 資料庫。

資料流彙總運算子圖示

Stream Aggregate

Stream Aggregate 運算子會依據一個或多個資料行將資料列分組,然後計算查詢所傳回的一個或多個彙總運算式。 這個運算子的輸出可稍後由查詢中的運算子參考,並/或傳回到用戶端。 Stream Aggregate 運算子需要其群組內的輸入項目依資料行排列。 如果資料因為前面的 Sort 運算子或因為已排序索引搜尋或掃描,而尚未進行排序,最佳化工具就會在這個運算子之前使用 Sort 運算子。 在 SHOWPLAN_ALL 陳述式或 SQL Server Management Studio 的圖形執行計畫中,GROUP BY 述詞中的資料行會列於 Argument 資料行中,而彙總運算式則會列在 Defined Values 資料行中。 Stream Aggregate 是實體運算子。

切換運算子圖示

參數

Switch 是一種特殊類型的串連 Iterator,它有 n 個輸入。 運算式與每一個 Switch 運算子相關聯。 根據運算式的傳回值 (介於 0 和 n-1 之間),Switch 會將適當的輸入資料流複製到輸出資料流。 Switch 的用途之一是實作查詢計畫,包括利用某些運算子向前快轉資料指標,例如 TOP 運算子。 Switch 同時為邏輯和實體運算子。

資料表刪除運算子圖示

Table Delete

Table Delete 實體運算子會從查詢執行計畫之 Argument 資料行所指定的資料表中刪除資料列。

資料表插入運算子圖示

Table Insert

Table Insert 運算子會從輸入將資料列插入查詢執行計畫之 Argument 資料行所指定的資料表中。 Argument 資料行也包含 SET:() 述詞,指出每一個資料行設定的值。 如果 Table Insert 沒有插入值的子系,則會從插入運算子本身取得插入的資料列。 Table Insert 是實體運算子。

資料表合併運算子

資料表合併

Table Merge 運算子會將合併資料流套用到堆積中。 此運算子會從運算子之 Argument 資料行內所指定的資料表中刪除、更新或插入資料列。 所執行的實際作業取決於運算子之 Argument 資料行內指定之 ACTION 資料行的執行階段值。 Table Merge 為實體運算子。

資料表掃描運算子圖示

Table Scan

Table Scan 運算子會從查詢執行計畫之 Argument 資料行所指定的資料表中擷取所有資料列。 如果 Argument 資料行中出現 WHERE:() 述詞,就只會傳回滿足述詞的那些資料列。 Table Scan 是邏輯與實體運算子。

資料表多工緩衝處理運算子圖示

資料表多工緩衝處理

Table Spool 運算子會掃描輸入,並將每個資料列的複本放入隱藏的多工緩衝資料表 (儲存在 tempdb 資料庫,直到查詢結束就不再存在)。 如果倒轉運算子 (例如,利用 Nested Loops 運算子),但是不需要重新繫結,會使用多工緩衝處理資料,而非重新掃描輸入。 Table Spool 是實體運算子。

資料表更新運算子圖示

資料表更新

Table Update 實體運算子會更新查詢執行計畫之 Argument 資料行所指定資料表中的輸入資料列。 SET:() 述詞決定每個更新資料行的值。 在 SET 子句中或這個運算子中,以及這個查詢中的其他位置,皆可參考這些數值。

資料表值函數運算子圖示

資料表值函式

Table-valued Function 運算子會評估資料表值函數 (Transact-SQL 或 CLR),並將產生的資料列儲存至 tempdb 資料庫。 如果父系 Iterator 要求資料列,Table-valued Function 便會從 tempdb 傳回資料列。

含有呼叫資料表值函數的查詢會產生內含 Table-valued Function Iterator 的查詢計畫。 資料表值函數可以使用不同的參數值進行評估:

  • 資料表值函數 XML 讀取器可輸入 XML BLOB 做為參數,並以 XML 文件的順序,產生代表 XML 節點的資料列集。 其他的輸入參數可能會限制傳回給 XML 文件子集的 XML 節點。

  • Table Valued Function XML Reader with XPath FilterXML Reader Table-valued Function 的一個特別類型,可限制輸出到滿足 XPath 運算式的 XML 節點。

Table-valued Function 是邏輯與實體運算子。

Top 運算子圖示

回到頁首

Top 運算子會掃描輸入,可能會根據排序的先後順序,只傳回指定數目或百分比的資料列。 Argument 資料行可以包含要檢查繫結的資料行清單。 在更新計畫中,可使用 Top 運算子強行限制資料列數。 Top 是邏輯與實體運算子。 Top 是邏輯與實體運算子。

前 N 個排序

Top N SortSort Iterator 類似,只不過它只需要前 N 個資料列,而不是整個結果集。 若 N 值較小,SQL Server 查詢執行引擎會嘗試在記憶體中執行整個排序作業。 若 N 的值較大,則查詢執行引擎會訴諸較一般性的排序方法,而不採用 N 做為參數。

擴充運算子 (UDX) 圖示

UDX

擴充運算子 (UDX) 會在 SQL Server 中實作許多 XQuery 和 XPath 作業的其中一項。 所有 UDX 運算子都是邏輯和實體運算子。

擴充運算子 (UDX) FOR XML 用於序列化關聯式資料列集,它會在單一輸出資料列的單一 BLOB 資料行中,以 XML 表示法輸入這個資料列集。 這是一個會區分順序的 XML 彙總運算子。

擴充運算子 (UDX) XML SERIALIZER 是區分順序的 XML 彙總運算子, 會以 XML 文件順序來輸入用於表示 XML 節點或 XQuery 純量的資料列,並在單一輸出資料列的單一 XML 資料行中產生序列化的 XML BLOB。

擴充運算子 (UDX) XML FRAGMENT SERIALIZER 是特殊類型的 XML SERIALIZER,可用於處理輸入資料列,而此輸入資料列用於表示要插入至 XQuery 插入資料修改延伸模組的 XML 片段。

擴充運算子 (UDX) XQUERY STRING 會評估用於表示 XML 節點之輸入資料列的 XQuery 字串值。 這是一個區分順序的字串彙總運算子。 它會輸出一個資料列以及多個資料行,每個資料行都代表含有輸入字串值的 XQuery 純量。

擴充運算子 (UDX) XQUERY LIST DECOMPOSER 是 XQuery 清單分解運算子。 針對代表 XML 節點的每一個輸入資料列,會產生代表 XQuery 純量的一或多個資料列,而如果輸入是 XSD 清單類型,則包含清單元素值。

擴充運算子 (UDX) XQUERY DATA 會評估表示 XML 節點之輸入的 XQuery fn:data() 函數。 這是一個區分順序的字串彙總運算子。 它會輸出一個資料列以及多個資料行,每個資料行都代表含有 fn:data() 結果的 XQuery 純量。

擴充運算子 XQUERY CONTAINS 會評估表示 XML 節點之輸入的 XQuery fn:contains() 函數。 這是一個區分順序的字串彙總運算子。 它會輸出一個資料列以及多個資料行,每個資料行都代表含有 fn:contains() 結果的 XQuery 純量。

擴充運算子 UPDATE XML NODE 會更新 XML 類型之 modify() 方法中,XQuery 取代資料修改延伸模組內的 XML 節點。

聯集

Union 運算子會掃描多個輸入,輸出掃描的每一資料列,並移除重複項。 Union 是邏輯運算子。

更新 (Database Engine) 運算子圖示

Update

Update 運算子會在查詢執行計畫之 Argument 資料行所指定的物件上,從其輸入中更新每一個資料列。 Update 是邏輯運算子。 實體運算子是 Table Update、Index Update 或 Clustered Index Update。

While 語言項目圖示

While

While 運算子會實作 Transact-SQL while 迴圈。 While 是語言元素。

資料表多工緩衝處理運算子圖示

Window Spool

Window Spool 運算子會將每一列展開成一組資料列,分別代表與其關聯的視窗。 查詢中的 OVER 子句會定義查詢結果集中的視窗,以及一個計算視窗中各資料列值的視窗函數。 Window Spool 是邏輯與實體運算子。