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

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

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

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

邏輯運算子

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

實體運算子

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

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

  • Open()Open() 方法會使實體運算子自行初始化,並設定任何必要的資料結構。 雖然實體運算子可能會收到許多 Open() 呼叫,但通常只會收到一個。

  • GetRow()GetRow() 方法會使實體運算子取得資料的第一個或下一個資料列。 實體運算子可能會接收零個或許多 GetRow() 呼叫。

  • Close()Close() 方法會使實體運算子執行某些清除作業並自行關閉。 實體運算子只會接收一個 Close() 呼叫,但 Close() 呼叫不一定能保證。

GetRow() 方法會傳回一列資料,而呼叫其的次數會在透過圖形和 XML 執行程序表所產生的執行程序表輸出中顯示為 ActualRows。 如需這些 SET 選項的詳細資訊,請參閱 SET STATISTICS PROFILE (Transact-SQL)SET STATISTICS XML (Transact-SQL)

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

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

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

XML 和圖形執行程序表中提供一個相關的計數器 ActualEndOfScans。 每當實體運算子存取至其資料流結尾時,此計數器就會遞增 1。 實體運算子可存取其資料流結尾零次、一次或多次。 如同重新繫結和倒轉,只有當運算子位於迴圈聯結內部時,結尾掃描次數才能大於 1。 結尾掃描次數應小於或等於重新繫結和倒轉的數目總和。

邏輯與實體運算子對應

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

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

批次模式執行

「批次模式執行」是用來同時處理多個資料列,而不是一次一個資料列的查詢處理方法 (如批次一詞所指)。 批次模式處理使用演算法,這些演算法已針對現代硬體上的多核心 CPU 和增加的記憶體輸送量進行最佳化。 批次模式可由一組運算子同時用於資料列存放區和資料行存放區物件。 如需詳細資訊,請參閱查詢處理架構指南

運算子描述

本節包含邏輯與實體運算子的說明: 您可以使用 SQL Server Management Studio (SSMS) 和 Azure Data Studio 的 [查詢計劃] 檢視中的 [屬性] 窗格來檢視查詢計劃和運算子的屬性。

提示

每當給定的圖形執行計畫圖示有一個具有兩個由右至左箭號的黃色圓圈時,就表示運算子會以平行方式執行。 如需平行處理原則的詳細資訊,請參閱執行緒和工作架構指南

Icon 執行程序表運算子 描述
自適性聯結 自適性聯結運算子可讓選擇的雜湊聯結或巢狀迴圈聯結方法延後到已掃描第一個輸入之後。

自適性聯結是實體運算子。 如需詳細資訊,請參閱了解自適性聯結
彙總 彙總運算子會計算包含 MINMAXSUMCOUNTAVG 的運算式。

彙總是邏輯與實體運算子。
算術運算式 「算術運算式」運算子會從資料列中現有的值計算出新的值。 SQL Server 較新版本不會使用算術運算式
判斷提示 「判斷提示」運算子會驗證條件。 例如,它會驗證參考完整性,或確定純量子查詢傳回一個資料列。 判斷提示運算子會針對每個輸入資料列來評估執行計畫之「屬性」窗格中的運算式。 如果這個運算式評估為 NULL,代表資料列透過判斷提示運算子的驗證,查詢會繼續執行。 如果這個運算式得出非 Null 值,則會引發相應的錯誤。

判斷提示是實體運算子。
指派 「指派」運算子會將運算式的值或常數指派給變數。

「指派」是語言元素。
Async Concat Async Concat 運算子只能使用於遠端查詢 (分散式查詢)。 它有 n 個子節點和一個父節點。 一般來說,某些子節點是參與分散式查詢的遠端電腦。 Async Concat 會同時向所有子節點發出 Open() 呼叫,然後再將點陣圖套用到每個子節點。 Async Concat 會針對每一個是 1 的位元,視需要將輸出資料列傳送給父節點。
點陣圖 SQL Server 會使用「點陣圖」運算子實作平行查詢計劃中的點陣圖篩選。 點陣圖篩選可先透過消除其索引鍵值無法產生任何聯結記錄的資料列來加速執行查詢,然後再透過另一個運算子 (如「平行處理原則」運算子) 傳遞資料列。 點陣圖篩選會於運算子樹狀目錄的一部分,以精簡方式顯示資料表中的一組值,以便從此樹狀目錄的另一個部分篩選第二個資料表中的資料列。 藉由盡早移除查詢中的不必要資料列,後續的運算子需要處理的資料列就會更少,而查詢的整體效能也會提升。 最佳化工具會判斷點陣圖何時具有足夠的選擇性能夠充分運用以及將篩選套用到哪個運算子。

「點陣圖」是實體運算子。
點陣圖建立 點陣圖建立運算子會出現在建立點陣圖的執行程序表輸出中。

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

「分支重新分割」和「區段重新分割」都是邏輯運算子。
廣播 「廣播」有一個子節點和 n 個父節點。 「廣播」會依要求將其輸入資料列傳送至多位取用者。 每位取用者都會收到所有資料列。 例如,若所有取用者都是雜湊聯結的建立者,則會建立 n 份雜湊表。
建立雜湊 指示建立記憶體最佳化的資料行存放區索引之批次雜湊表。

適用於:僅限 SQL Server 2012 (11.x)。
叢集索引刪除 叢集索引刪除運算子會從 [物件] 屬性指定的叢集索引中刪除資料列,該屬性在圖形和 XML 執行程序表的 [屬性] 窗格中列出。 如果 SeekPredicatePredicate 存在,則只會刪除符合述詞的資料列。

注意:叢集索引的變更可能會影響非叢集索引。

叢集索引刪除是實體運算子。
叢集索引插入 叢集索引插入運算子會將來自其輸入的資料列插入 [物件] 屬性指定的叢集索引中,該屬性在圖形和 XML 執行程序表的 [屬性] 窗格中列出。 XML 執行程序表包含 SetPredicateColumnReference 屬性,這些屬性可用來判斷每個資料行設定的值。 如果叢集索引插入沒有插入值的子系,則會從插入運算子本身取得插入的資料列。

注意:叢集索引的變更可能會影響非叢集索引。

叢集索引刪除是實體運算子。
叢集索引合併 「叢集索引合併」運算子會將合併資料流套用到叢集索引。 此運算子會從 [物件] 屬性指定的叢集索引中刪除、更新或插入資料列,該屬性在圖形和 XML 執行程序表的 [屬性] 窗格中列出。 實際執行的作業取決於 ActionColumn 屬性的執行階段值。

注意:叢集索引的變更可能會影響非叢集索引。

「叢集索引合併」是實體運算子。
叢集索引掃描 叢集索引掃描運算子會掃描 [物件] 屬性指定的叢集索引,該屬性在圖形和 XML 執行程序表的 [屬性] 窗格中列出。 出現選擇性的述詞時,只會傳回符合述詞的資料列。 如果 [屬性] 窗格或 XML 執行程序表中的 [排序] 屬性為 True,則查詢處理器已判斷資料列必須依照叢集索引對其進行排序的順序傳回。 如果 [排序] 屬性為 False,資料庫引擎會以最佳方式掃描索引,而不一定對輸出進行排序。

「叢集索引掃描」是邏輯與實體運算子。
叢集索引搜尋 「叢集索引搜尋」運算子使用索引的搜尋能力,從叢集索引中擷取資料列。 圖形和 XML 執行程序表的 [屬性] 窗格中所列的 [物件] 屬性包含正在使用的叢集索引名稱。 SeekPredicate 包含搜尋所用的述詞。 資料庫引擎會使用索引來處理符合 SeekPredicate 的資料列。 它也可以包含 [述詞] 屬性,讓資料庫引擎針對符合 SeekPredicate 的所有資料列進行評估,但此為選擇性,且不使用索引來完成此程序。

如果 [屬性] 窗格或 XML 執行程序表中的 [排序] 屬性為 True,則查詢處理器已判斷資料列必須依照叢集索引對其進行排序的順序傳回。 如果 [排序] 屬性為 False,資料庫引擎會以最佳方式搜尋索引,而不一定對輸出進行排序。 要求輸出維持次序會比產生不按次序的輸出效率更低。

「叢集索引搜尋」是邏輯與實體運算子。
叢集索引更新 叢集索引更新運算子會更新 [物件] 屬性指定的叢集索引中的資料列,該屬性在圖形和 XML 執行程序表的 [屬性] 窗格中列出。 如果 [述詞] 屬性存在,則只會更新符合此述詞的資料列。 如果 SetPredicate 屬性存在,則每個更新的資料行都會設為這個值。 如果 DefineValue 屬性存在,則會列出這個運算子定義的值。 在 SET 子句中或這個運算子中以及這個查詢中的其他位置,都可以參考這些值。

注意:叢集索引的變更可能會影響非叢集索引。

「叢集索引更新」是邏輯與實體運算子。
摺疊 「摺疊」運算子可最佳化更新處理。 執行更新時,它可以分割成 (使用「分割」運算子) 刪除與插入。 [屬性] 窗格包含指定索引鍵資料行清單的 Group By 述詞。 如果查詢處理器發現了刪除及插入相同索引鍵值的相鄰資料列,會以更有效率的單一更新作業來取代這些不同的作業。

「摺疊」是邏輯與實體運算子。
資料行存放區索引刪除 資料行存放區索引刪除運算子會從 [物件] 屬性指定的資料行存放區索引中刪除資料列,該屬性在圖形和 XML 執行程序表的 [屬性] 窗格中列出。 對於叢集資料行存放區索引,刪除透過叢集索引刪除運算子進行;對於非叢集資料行存放區索引,刪除透過索引刪除運算子進行。 索引類型 (ClusteredNonClusteredViewNonClustered) 是在 XML 執行程序表的 IndexKind 屬性中指定。 資料行存放區索引刪除不支援 SeekPredicate。 要刪除的資料列會從子運算子讀取。

資料行存放區索引刪除是實體運算子。
資料行存放區索引插入 資料行存放區索引插入運算子會將來自其輸入的資料列插入 [物件] 屬性指定的資料行存放區索引中,該屬性在圖形和 XML 執行程序表的 [屬性] 窗格中列出。 對於叢集資料行存放區索引,插入透過叢集索引插入運算子進行;對於非叢集資料行存放區索引,插入透過索引插入運算子進行。 索引類型 (ClusteredNonClusteredViewNonClustered) 是在 XML 執行程序表的 IndexKind 屬性中指定。 XML 執行程序表包含 SetPredicateColumnReference 屬性,這些屬性可用來判斷每個資料行設定的值。

注意:叢集索引的變更可能會影響非叢集索引。

資料行存放區索引插入是實體運算子。
資料行存放區索引合併 資料行存放區索引合併代表使用叢集索引合併運算子套用合併資料流。 此運算子會從 [物件] 屬性指定的叢集資料行存放區索引中刪除、更新或插入資料列,該屬性在圖形和 XML 執行程序表的 [屬性] 窗格中列出。 實際執行的作業取決於 ActionColumn 屬性的執行階段值。

注意:叢集索引的變更可能會影響非叢集索引。

資料行存放區索引合併是實體運算子。
資料行存放區索引掃描 資料行存放區索引掃描運算子會掃描 [物件] 屬性指定的資料行存放區索引,該屬性在圖形和 XML 執行程序表的 [屬性] 窗格中列出。 對於叢集資料行存放區索引,掃描透過叢集索引掃描運算子進行;對於非叢集資料行存放區索引,掃描透過索引掃描運算子進行。 索引類型 (ClusteredNonClusteredViewNonClustered) 是在 XML 執行程序表的 IndexKind 屬性中指定。 出現選擇性的述詞時,只會傳回符合述詞的資料列。 SeekPredicate 屬性僅適用於分割的資料行存放區索引,而且只有相等或不等條件。 如果分割的資料行位於查詢述詞中,則刪除分割區可減少要掃描之資料列群組的數量。

資料行存放區索引掃描是實體運算子。
資料行存放區索引更新 資料行存放區索引更新運算子會更新 [物件] 屬性指定的資料行存放區索引中之一或多個資料列,該屬性在圖形和 XML 執行程序表的 [屬性] 窗格中列出。 對於叢集資料行存放區索引,更新透過叢集索引更新運算子進行;對於非叢集資料行存放區索引,更新透過索引更新運算子進行。 索引類型 (ClusteredNonClusteredViewNonClustered) 是在 XML 執行程序表的 IndexKind 屬性中指定。 資料行存放區索引更新不支援 SeekPredicate。 要更新的資料列會從子運算子讀取。 如果 SetPredicate 屬性存在,則每個更新的資料行都會設為這個值。 如果 DefineValue 屬性存在,則會列出這個運算子定義的值。 在 SET 子句中或這個運算子中以及這個查詢中的其他位置,都可以參考這些值。

注意:叢集索引的變更可能會影響非叢集索引。

資料行存放區索引更新是實體運算子。
Compute Scalar 「計算純量」運算子會評估運算式,以產生計算的純量值。 然後可將此值傳回給使用者,或由查詢的其他地方來參考,或兩者皆是。 例如在篩選述詞或聯結述詞中,就會見到這兩種情況。

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

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

「串連」是邏輯與實體運算子。
條件 (IfWhile) 條件運算子會根據 IFWHILE 迴圈執行條件處理。 IfWhile 是語言元素。
固定掃描 「固定掃描」運算子會在查詢中加入固定的一列或多列。 「計算純量」運算子通常用於「固定掃描」之後,可以將資料行加入由「固定掃描」運算子所產生的資料列。 固定掃描可以產生一或多個資料列,其中包含零個或多個資料行。
轉換 「轉換」運算子可將某個純量資料類型轉換為另一個資料類型。

「轉換」是語言元素。
交叉聯結 「交叉聯結」運算子會將第一個 (頂端) 輸入的每一列與第二個 (底部) 輸入的每一列相聯結。

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

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

實體運算子包括動態提取查詢索引鍵集母體擴展查詢重新整理查詢快照集
宣告 宣告運算子會在查詢計畫中配置區域變數。

「宣告」是語言元素。
刪除 刪除運算子會 (從一個物件中) 刪除符合 [屬性] 窗格中之選擇性述詞的資料列。
刪除的掃描 在觸發程序中,刪除的掃描運算子會掃描已刪除的資料表。
Distinct 「相異」運算子可從資料列集或從值集合移除重複的項目。

「相異」是邏輯運算子。
相異排序 相異排序邏輯運算子會掃描輸入,移除重複項,並依 [屬性] 窗格的 distinct order by 述詞所指定的資料行排序。

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

如果輸出經過分割的話,[屬性] 窗格會包含 partition columns 述詞與分割資料行。

「散發資料流」是邏輯運算子。
動態 「動態」運算子採用的資料指標,可以看到其他人進行的所有變更。
急切的多工緩衝處理 「急切的多工緩衝處理」運算子會取用整個輸入,將每一列儲存在 tempdb 資料庫的隱藏暫存物件中。 如果倒轉運算子 (例如,利用「巢狀迴圈」運算子),但是不需要重新繫結,會使用多工緩衝處理資料,而非重新掃描輸入。 如果必須重新繫結的話,就丟棄多工緩衝處理的資料,然後重新掃描 (重新繫結) 輸入以重建多工緩衝處理物件。 「急切的多工緩衝處理」運算子會以「急切的」方式建立多工緩衝處理檔案:當多工緩衝處理的父系運算子要求第一列時,「多工緩衝處理」運算子會消耗其輸入運算子的所有資料列,並將它們儲存在多工緩衝處理中。

急切的多工緩衝處理 是邏輯運算子。
提取查詢 「提取查詢」運算子會在對資料指標發出提取時擷取資料列。
Filter 篩選運算子會掃描輸入,只傳回滿足 [屬性] 窗格中篩選運算式 (述詞) 的資料列。
流程相異 流程相異運算子會掃描輸入,移除重複項。 相異運算子會在產生任何輸出之前就先取用所有輸入,流程相異運算子則會每取得一個輸入資料列就傳回一列 (除非該資料列重複,若遇到這種情況,則會將其捨棄)。

流程相異是邏輯運算子。
外部索引鍵參考檢查 外部索引鍵參考檢查運算子會就地執行參考完整性檢查,藉由比較已修改之資料列與參考資料表的資料列,驗證所做的修改未破壞參考完整性。 當相同的主要或唯一索引鍵有超過 253 個外部索引鍵參考時,就會使用外部索引鍵參考檢查運算子。

外部索引鍵參考檢查是邏輯與實體運算子。
完整外部聯結 「完整外部聯結」邏輯運算子所傳回的每個資料列,皆滿足第一個 (上方) 輸入的聯結述詞與第二個 (下方) 輸入的每一個資料列相聯結。 它也會傳回以下資料列:

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

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

不包含相符值的輸入會以 Null 值傳回。

完整外部聯結 是邏輯運算子。
蒐集資料流 「蒐集資料流」運算子僅用於平行查詢計畫中。 「蒐集資料流」運算子會耗用數個輸入資料流,並將輸入資料流合併而產生記錄的單一輸出資料流。 記錄內容與格式不會變更。 若此運算子要保留順序,那麼所有輸入資料流都必須排序好。 若輸出經過排序,則 [屬性] 窗格中會包含 order by 述詞,以及要排序的資料行名稱。

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

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

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

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

「點陣圖」是實體運算子。 如需詳細資訊,請參閱了解雜湊聯結
索引刪除 索引刪除運算子會從 [屬性] 窗格所指定的非叢集索引中刪除資料列。

索引刪除是實體運算子。
索引插入 索引插入運算子會將輸入資料列插入 [屬性] 窗格所指定的非叢集索引中。 [屬性] 窗格也包含 set 述詞,指出每一個資料行設定的值。

「索引插入」是實體運算子。
索引掃描 索引掃描運算子會擷取 [屬性] 窗格所指定之非叢集索引的所有資料列。 如果 [屬性] 窗格出現選擇性的 where 述詞,則只傳回符合述詞的資料列。

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

「索引搜尋」是邏輯與實體運算子。
索引多工緩衝處理 索引多工緩衝處理運算子在 [屬性] 窗格中包含 seek 述詞。 「索引多工緩衝處理」運算子會掃描其輸入資料列,將每一列的副本放入隱藏的多工緩衝處理檔中 (儲存在 tempdb 資料庫中,直到查詢結束就不再存在),並對資料列建立非叢集索引。 這讓您可以使用索引的搜尋能力來輸出滿足 seek 述詞的資料列。 如果倒轉運算子 (例如,利用「巢狀迴圈」運算子),但是不需要重新繫結,會使用多工緩衝處理資料,而非重新掃描輸入。

索引多工緩衝處理是實體運算子。
索引更新 索引更新實體運算子會在 [屬性] 窗格所指定的非叢集索引內,從它的輸入更新資料列。 如果出現 set 述詞,則每個更新的資料行都會設為這個值。

索引更新是實體運算子。
內部聯結 內部聯結運算子所傳回的每個資料列,皆滿足第一個 (上方) 輸入與第二個 (下方) 輸入的聯結述詞。

內部聯結是邏輯運算子。
插入 插入運算子會將輸入的每一個資料列,插入 [屬性] 窗格中指定的物件。 實體運算子是「資料表插入」、「索引插入」或「叢集索引插入」運算子。

插入是邏輯運算子。
插入的掃描 在觸發程序中,插入的掃描運算子會掃描已插入資料表。

「插入的掃描」是邏輯與實體運算子。
內建 「內建」運算子會叫用內部 Transact-SQL 函數。

「內建」是語言元素。
Iterator 產生圖形執行程序表的邏輯若找不到適當的 Iterator 圖示,就會顯示 Iterator 雜物箱圖示。 [雜物箱] 圖示不一定表示錯誤條件。
索引鍵查閱 「索引鍵查閱」運算子可在包含叢集索引的資料行上進行書籤查閱。 [屬性] 窗格包含叢集索引的名稱和叢集索引鍵,可用來查閱叢集索引中的資料列。 「索引鍵查閱」一律都會伴隨「巢狀迴圈」運算子。 如果 [屬性] 窗格中出現 WITH PREFETCH 子句,表示查詢處理器已決定在叢集索引中查詢書籤時,使用非同步預先提取 (預先讀取) 是最佳方法。

在查詢計畫中使用「索引鍵查閱」運算子,表示查詢可以進行效能微調。 例如,您可以加入涵蓋索引來提高查詢效能。
索引鍵集 索引鍵集運算子使用可以查看更新,但無法插入其他人所製作的資料指標。
Language 元素 產生圖形執行程序表的邏輯若找不到適當的 Iterator 圖示,就會顯示 Language 元素雜物箱圖示。 [雜物箱] 圖示不一定表示錯誤條件。
延遲多工緩衝處理 「延遲多工緩衝處理」邏輯運算子會將其輸入的每一個資料列,都儲存在 tempdb 資料庫內隱藏的暫存物件中。 如果倒轉運算子 (例如,利用「巢狀迴圈」運算子),但是不需要重新繫結,會使用多工緩衝處理資料,而非重新掃描輸入。 如果必須重新繫結的話,就丟棄多工緩衝處理的資料,然後重新掃描 (重新繫結) 輸入以重建多工緩衝處理物件。 「延遲多工緩衝處理」運算子會以「延遲」方式建立它的多工緩衝處理檔案,也就是說,每次多工緩衝處理的父系運算子要求一個資料列時,多工緩衝處理運算子就會從它的輸入運算子取得一個資料列,然後將它儲存在多工緩衝處理內,而不是一次取用所有資料列。

延遲多工緩衝處理是邏輯運算子。
左方反半聯結 當第二個 (下方) 輸入中沒有相符的資料列時,左方反半聯結運算子將會從第一個 (上方) 輸入傳回每一個資料列。 如果 [屬性] 窗格中沒有聯結述詞,則每一資料列就是一個符合資料列。

左方反半聯結 是邏輯運算子。
None 左外部聯結 左外部聯結邏輯運算子所傳回的每個資料列,皆滿足第一個 (上方) 輸入與第二個 (下方) 輸入的聯結述詞。 它也會傳回第一個輸入中與第二個輸入完全不相符的任何資料列。 第二個輸入中的不符合資料列會以 null 值傳回。 如果 [屬性] 窗格中沒有聯結述詞,則每一資料列就是一個符合資料列。

左外部聯結 是邏輯運算子。
None 左方半聯結 當第二個 (下方) 輸入中有相符的資料列時,左方半聯結運算子將會從第一個 (上方) 輸入傳回每一個資料列。 如果 [屬性] 窗格中沒有聯結述詞,則每一資料列就是一個符合資料列。

左方半聯結 是邏輯運算子。
記錄檔資料列掃描 「記錄檔資料列掃描」運算子會掃描交易記錄。

「記錄檔資料列掃描」是邏輯與實體運算子。
合併間隔 「合併間隔」運算子會合併多個 (可能重疊) 間隔以產生最小的非重疊間隔,然後使用這些間隔,尋找索引項目。 這個運算子一般會出現在一或多個計算純量運算子之前,重疊在固定掃描運算子之上,後者會建構這個運算子所合併的間隔 (以資料列中的資料行代表)。

「合併間隔」是邏輯與實體運算子。
合併聯結 「合併聯結」運算子會執行內部聯結、左方外部聯結、左方半聯結、左方反半聯結、右方外部聯結、右方半聯結、右方反半聯結,以及等位邏輯作業。

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

「合併聯結」是實體運算子。 如需詳細資訊,請參閱了解合併聯結
巢狀迴圈 「巢狀迴圈」運算子執行內部聯結、左方外部聯結、左方半聯結和左方反半聯結邏輯運算。

巢狀迴圈聯結通常會使用索引,在內部資料表中搜尋外部資料表的每個資料列。 查詢處理器會根據預期的成本,決定是否要排序外部輸入,以改進對內部輸入的索引搜尋位置。 任何滿足 [屬性] 窗格中的選擇性述詞的資料列,會根據所執行的邏輯運算而適當地傳回。 當 OPTIMIZED 屬性設定為 True 時,則表示已使用最佳化的巢狀迴圈 (或批次排序)。

「巢狀迴圈」是實體運算子。 如需詳細資訊,請參閱了解巢狀迴圈聯結
線上索引插入 線上索引插入運算子指示索引作業 (建立、改變或卸除) 於線上進行。 也就是說,基礎資料表資料在索引操作期間仍然可供使用者使用。

線上索引插入是實體運算子。
平行處理原則 「平行處理原則」運算子 (或 Exchange 迭代器) 會執行散發資料流、收集資料流及重新分割資料流的邏輯作業。 [屬性] 窗格可以包含 partition columns 述詞,以及被分割的資料行清單 (以逗點分隔)。 [屬性] 窗格也可以包含 order by 述詞,用以列出分割期間要保留排序順序的資料行。

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

「平行處理原則」是實體運算子。 如需「平行處理原則運算子」的詳細資訊,請參閱「平行處理原則」運算子
參數資料表掃描 「參數資料表掃描」運算子會掃描在目前的查詢中當做參數使用的資料表。 一般而言,這是用於預存程序中的 INSERT 查詢。

「參數資料表掃描」是邏輯與實體運算子。
None 部分彙總 「部分彙總」用於平行計畫。 它將彙總函式套用至盡可能最多的輸入資料列,因此不需要寫入磁碟 (稱為「溢出」)。 「雜湊比對」是唯一可以實作部份彙總的實體運算子 (迭代器)。

部分彙總 是邏輯運算子。
母體擴展查詢 「母體擴展查詢」運算子會在開啟資料指標時,擴展資料指標的工作資料表。
重新整理查詢 「重新整理查詢」運算子會在提取緩衝區中提取資料列目前的資料。
遠端刪除 「遠端刪除」運算子會刪除遠端物件的輸入資料列。

「遠端刪除」是邏輯與實體運算子。
遠端索引掃描 遠端索引掃描運算子會掃描 [屬性] 窗格中指定的遠端索引。

「遠端索引掃描」是邏輯與實體運算子。
遠端索引搜尋 「遠端索引搜尋」運算子會使用遠端索引物件的搜尋功能來擷取資料列。 [屬性] 窗格包含所使用的遠端索引名稱及 seek 述詞。

遠端索引搜尋是邏輯和實體運算子。
遠端插入 「遠端插入」運算子會將輸入資料列插入遠端物件。

「遠端插入」是邏輯與實體運算子。
遠端查詢 「遠端查詢」運算子會對遠端來源送出查詢。 傳給遠端伺服器的查詢文字會出現在 [屬性] 窗格中。

「遠端查詢」是邏輯與實體運算子。
遠端掃描 「遠端掃描」運算子會掃描遠端物件。 遠端物件的名稱會出現在 [屬性] 窗格中。

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

「遠端更新」是邏輯與實體運算子。
重新分割資料流 重新分割資料流運算子 (或交換迭代器) 會消耗多個資料流,並產生多個記錄的資料流。 記錄內容與格式不會變更。 如果查詢最佳化工具使用點陣圖篩選,輸出資料流中的資料列數會減少。 輸入資料流的每個資料錄會被放入一個輸出資料流。 如果這個運算子要保留次序,那麼所有輸入資料流都必須排序好,而且合併成數個排序的輸出資料流。 如果輸出經過分割的話,[屬性] 窗格中會包含 partition columns 述詞與分割資料行。 若輸出經過排序,則 [屬性] 窗格中會包含 order by 述詞,以及要排序的資料行。 此運算子只用於平行查詢計畫。

重新分割資料流 是邏輯運算子。
結果 「結果」運算子是在查詢計畫結束時所傳回的資料。 這通常是執行程序表的根元素。

「結果」是語言元素。
RID 查閱 「RID 查閱」是堆積上的書籤查閱,它會使用提供的資料列識別碼 (RID)。 [屬性] 窗格包含書籤標籤,可用以查閱資料表中的資料列,以及已查閱過之資料列的資料表名稱。 「RID 查閱」一律都會伴隨 NESTED LOOP JOIN

「RID 查閱」是實體運算子。 如需書籤查閱的詳細資訊,請參閱讀取認可和書籤查閱
右方反半聯結 右方反半聯結運算子會在第一個 (上方) 輸入中沒有符合資料列存在時,輸出第二個 (下方) 輸入中的每一列。 相符合的資料列定義是滿足 [屬性] 窗格中述詞的資料列 (如果沒有任何述詞,則每一列都是相符列)。

右方反半聯結 是邏輯運算子。
None 右外部聯結 「右外部聯結」運算子所傳回的每個資料列,皆滿足第二個 (下方) 輸入與第一個 (上方) 輸入之每個相符資料列的聯結。 它也會傳回第二個輸入中與第一個輸入完全不相符的任何資料列,以 NULL 相聯結。 如果 [屬性] 窗格中沒有聯結述詞,則每一資料列就是一個符合資料列。

右外部聯結 是邏輯運算子。
None 右方半聯結 當第一個 (頂端) 輸入有相符的資料列時,右方半聯結運算子會從第二個 (底端) 輸入傳回每一個資料列。 如果 [屬性] 窗格中沒有聯結述詞,則每一資料列就是一個符合資料列。

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

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

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

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

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

「序列」是邏輯與實體運算子。
快照式 快照式運算子會建立一個資料指標,而不會看到其他人所做的變更。
排序 「排序」運算子會排序所有內送的資料列。 如果這個作業會移除重複項,則 [屬性] 窗格中會包含 distinct order by 述詞,或包含 order by 述詞以及將會排序的資料行清單 (以逗號分隔)。 如果將資料行依遞增順序排序,資料行前會加上 ASC 值,如果將資料行依遞減順序排序,資料行前會加上 DESC 值。

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

「分割」是邏輯與實體運算子。
多工緩衝處理 「多工緩衝處理」運算子會將中繼查詢結果儲存到 tempdb 資料庫。
Stream Aggregate 「資料流彙總」運算子會依據一個或多個資料行將資料列分組,然後計算查詢所傳回的一個或多個彙總運算式。 這個運算子的輸出可稍後由查詢中的運算子參考,並/或傳回到用戶端。 「資料流彙總」運算子需要其群組內的輸入項目依資料行排列。 如果資料因為前面的排序運算子或因為已排序索引搜尋或掃描,而尚未排序,最佳化工具就會在這個運算子之前使用排序運算子。 在 SHOWPLAN_ALL 陳述式或 SQL Server Management Studio 的圖形執行計畫中,group by 述詞中的資料行會列於 [屬性] 窗格中,而彙總運算式則會列在 Defined Values 資料行中。

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

參數是邏輯和實體運算子。
資料表刪除 資料表刪除運算子會從查詢執行計畫之 [屬性] 窗格所指定的資料表中刪除資料列。

資料表刪除是實體運算子。
資料表插入 資料表插入運算子會從輸入將資料列插入查詢執行計畫之 [屬性] 窗格所指定的資料表中。 [屬性] 窗格也包含 set 述詞,指出每一個資料行設定的值。 如果「資料表插入」沒有插入值的子系,則會從插入運算子本身取得插入的資料列。

「資料表插入」是實體運算子。
資料表合併 「資料表合併」運算子會將合併資料流套用到堆積中。 此運算子會從運算子之 [屬性] 窗格內所指定的資料表中刪除、更新或插入資料列。 實際執行的作業取決於 ActionColumn 屬性的執行階段值

「資料表合併」是實體運算子。
資料表掃描 資料表掃描運算子會從查詢執行計畫之 [屬性] 窗格所指定的資料表中擷取所有資料列。 如果 [屬性] 窗格中出現 where 述詞,就只會傳回滿足述詞的那些資料列。

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

「資料表多工緩衝處理」是實體運算子。
資料表更新 資料表更新運算子會更新查詢執行計畫之 [屬性] 窗格所指定資料表中的輸入資料列。 set 述詞決定每個更新資料行的值。 在 SET 子句中或這個運算子中以及這個查詢中的其他位置,都可以參考這些數值。

資料表更新是實體運算子。
資料表值函式 「資料表值函式」運算子會評估資料表值函數 (Transact-SQL 或 CLR),並將產生的資料列儲存至 tempdb 資料庫。 如果父系 Iterator 要求資料列,資料表值函式便會從 tempdb 傳回資料列。

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

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

- 「含 XPath 篩選的資料表值函式 XML 讀取器」是一種特別的 XML 讀取器資料表值函式,可將輸出限制為滿足 XPath 運算式的 XML 節點。

「資料表值函式」是邏輯與實體運算子。
前幾個 「頂端」運算子會掃描輸入,可能會根據排序的先後順序,只傳回指定數目或百分比的資料列。 [屬性] 窗格可以包含要檢查繫結的資料行清單。 在更新計畫中,可使用「頂端」運算子強行限制資料列數。

「頂端」是邏輯與實體運算子。
前 N 個排序 「前 N 個排序」與「排序」Iterator 類似,只不過它只需要前 N 個資料列,而不是整個結果集。 若 N 值較小,SQL Server 查詢執行引擎會嘗試在記憶體中執行整個排序作業。 若 N的值較大,則查詢執行引擎會訴諸比較一般性的排序方法,而不採用 N 作為參數。
UDX 擴充運算子 (UDX) 會在 SQL Server 中實作許多 XQuery 和 XPath 作業的其中一項。

- 擴充運算子 (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 純量。

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

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

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

Union 是邏輯運算子。
更新 更新運算子會在查詢執行計畫之 [屬性] 窗格所指定的物件上,從其輸入中更新每一個資料列。

「更新」是邏輯運算子。 實體運算子是「資料表更新」、「索引更新」或「叢集索引更新」。
視窗多工緩衝處理 「視窗多工緩衝處理」運算子會將每一列展開成一組資料列,分別代表與其關聯的視窗。 查詢中的 OVER 子句會定義查詢結果集中的視窗,以及一個計算視窗中各資料列值的視窗函數。

「視窗多工緩衝處理」是邏輯與實體運算子。

注意

SQL Server 文件通常會使用「B 型樹狀結構」一詞來指稱索引。 在資料列存放區索引中,SQL Server 會實作 B+ 樹狀結構。 這不適用於資料行存放區索引或記憶體內部資料存放區。 如需詳細資訊,請參閱 SQL Server 和 Azure SQL 索引架構和設計指南