查詢執行參考資料

本頁說明使用「查詢說明」執行的查詢輸出內容。 如要瞭解如何使用查詢說明功能執行查詢,請參閱「使用查詢說明功能分析查詢執行作業」。

常見概念

執行樹狀結構會使用下列常見概念和術語。

資料列和記錄

「列」和「記錄」這兩個詞彙一般是指文件或索引項目。

變數

執行節點中可能會出現下列內部變數:

  • __key__- 索引鍵是文件的內部 ID。這是專案、資料庫和文件完整路徑的絕對專屬 ID。
  • __id__:ID 是集合中文件的專屬 ID。 在單一集合中不得重複。
  • __$0__…__$N__- 這些是內容專屬變數,會在執行樹狀結構中建立或參照。這些變數通常用於參照文件內容,或是在查詢執行期間評估運算式的值。

舉例來說,假設您使用擴充節點從文件 __key__ 擷取 __id__

Extend
    |  expressions: [_id(__key__) AS __id__]
    |  records returned: 1

限制和範圍

部分掃描節點會使用 constraintsranges 屬性,說明掃描的值範圍。這些屬性使用範圍樹狀結構格式,其中包含值清單。這些值對應於索引定義中顯示的鍵排序清單。舉例來說,樹狀結構中顯示的第一個範圍 (此處為 (1..5]) 對應至排序鍵清單中第一個鍵 (此處為 a) 的限制:

| index: type=CollectionGroupIndex, id=CICAgOjXh#EK, keys=[a ASC, b ASC, __key__ ASC]
| constraints: /
               |----(1..5]
                    |----[1L]

每個縮排層級都表示套用至清單中下一個鍵的限制。方括號代表含頭尾的範圍,圓括號則代表不含頭尾的範圍。在本例中,限制會轉譯為 1 < "a" <= 5"b" = 1

在下列範例中,a 有多個分支,限制對應至 1 < a <= 5 OR a = 10

| constraints: /
               |----(1L, 5L]
               |----[10L]

重要變數

在某些掃描節點 (例如 SequentialScan) 中,鍵清單會是 index 屬性的一部分,且 Scan 節點中會有個別的 keys 屬性。Scan 節點中的 keys 屬性會依序表示索引定義中每個鍵的變數名稱。變數可用於參照執行樹狀結構中掃描欄位的執行階段值。

在下列範例中,目前文件的 user 欄位值會對應至變數 __$6__,而 date_placed 的值則會對應至 __$7__

index: type=CollectionGroupIndex, id=CICAgOjXh4EK, keys=[user ASC, date_placed ASC, __path__ ASC]
keys: [__$6__ ASC, __$7__ ASC, __path__ ASC]

執行節點

查詢執行樹狀結構可包含下列節點。

SeekingScan

代表動態掃描,傳回的資料列可能不在單一連續索引範圍內,且必須執行多個不同的掃描才能滿足查詢。

舉例來說,如果查詢中存在 ab 等於 1,並在 ["a" ASC, "b" ASC] 的索引上運作,則需要掃描並傳回 a 各個不同值的個別範圍 (可能不是連續範圍)。這比完整 TableScan 更有效率,但比 ["b" ASC, "a" ASC] 複合式索引上的單一 SequentialScan 效率低。

• SeekingScan
| constraints: /
               |----(-∞..+∞)
                    |----[1L]
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, quantity ASC, __key__ ASC]
| keys: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| properties: Selection { user }
| records returned: 1
| records scanned: 1

SequentialScan

代表儲存空間中靜態、連續的資料列範圍掃描,可透過單一讀取作業執行。

key ordering length 是指必須保留並以原始鍵順序傳回的鍵數。如果是 [k1, k2, k3] 的結構定義,索引鍵排序長度為 0 表示掃描可以傳回任何順序,1 表示依 k1 排序,但具有相同 k1 值的資料列可以採用任何順序,3 則會傳回完全排序的檔案。

• SequentialScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| key ordering length: 3
| keys: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| limit: 10
| properties: Selection { a }
| ranges: /
| records returned: 1
| records scanned: 1

UniqueScan

代表儲存空間中靜態連續列範圍的掃描,並在記憶體中重複資料刪除列。

• UniqueScan
| index: type=CollectionGroupIndex, id=CAE, keys=[user ASC, date_placed ASC, __key__ ASC]
| keys: [__$1__ ASC, __$2__ ASC, __key__ ASC]
| properties: Selection { a }
| ranges: /
          |----(-∞..+∞)
| records returned: 1
| records scanned: 1

TableAccess

將提供的資料列 ID 重新加入主要儲存空間的實際資料列內容。如果父項節點 (或最終查詢結果) 需要文件中的欄位子集,則必須使用 TableAccess

• TableAccess
|  order: PRESERVE_INPUT_ORDER
|  peak memory usage: 4.00 KiB (4,096 B)
|  properties: *
|  records returned: 1

TableScan

完整掃描收藏內容,但掃描結果未排序。在執行查詢時,如果沒有相關聯的索引,就會使用這個選項。

順序可以是 STABLEUNDEFINED,其中 STABLE 表示確定性排序。

• TableScan
|  order: STABLE
|  properties: *
|  records returned: 1
|  records scanned: 1
|  source: (default)#/**/collection

HashAggregate

匯總作業的雜湊支援實作項目。必須先在記憶體中具體化整個群組,才能傳回結果,且不得超過查詢記憶體限制

• HashAggregate
|  aggregations: [sum(__$0__) AS total]
|  groups: [a]
|  peak memory usage: 4.00 KiB (4,096 B)
|  records returned: 0

StreamAggregate

專門的匯總節點,一次只會維護單一群組的狀態,可減少尖峰記憶體用量。當基礎子節點會依序傳回群組時使用。舉例來說,在欄位上使用索引時,依欄位的不重複值分組。

• StreamAggregate
|  keys: [foo ASC, bar ASC]
|  properties: Selection { baz }
|  aggregations: [$sum(foo) AS baz]

MajorSort

對一組固定的屬性執行排序作業。一次將所有記錄具體化到記憶體中,並依序傳回排序後的值,排序集的規模受查詢記憶體限制限制。

如果提供後續限制,系統會使用 top-k 排序演算法來減少記憶體用量。只要儲存 k 個考量元素的記憶體用量不超過上限,即可對任意大小的記錄集執行排序。

• MajorSort
|  fields: [a ASC, b DESC]
|  limit: 10
|  peak memory usage: 4.00 KiB (4,096 B)
|  records returned: 1

Concat

串連多個子節點的結果,並將結果傳回父項節點。這個節點不會重複資料,且傳回結果的順序不確定。

• Concat
├── • TableAccess
...
├── • TableAccess

限制

將一組屬性投影至父項節點。可防止未使用的欄位傳播,進而減少記憶體用量,因為這些欄位與查詢的其餘部分無關。

• Restrict
|  expressions: [foo AS foo, bar AS bar]
|  records returned: 0

延長

在結果集中的每個資料列新增一組欄位。用於將欄位新增至文件,並做為中繼節點,支援更複雜的作業。

• Extend
|  expressions: ["bar" AS foo]
|  records returned: 1

篩選器

只在資料列符合提供的運算式時,才選擇性傳回資料列。

• Filter
|  expression: $eq(foo, "bar")
|  records returned: 1

產生要處理的常值序列。主要用於將一組/一份文件清單做為查詢的輸入內容。

• Values
| expression: [{__key__=/col/1}, {__key__=/col/2}]

ReplaceWith

以所提供的 map 運算式中的欄位,取代子節點產生的資料列欄位。

• ReplaceWith
|  map: map("full_name", str_concat(first_name, " ", last_name)), current_context())
|  records returned: 1

Unnest

取消巢狀結構,取得子節點產生的值。

• Unnest
|  expression: foo AS unnested_foo

限制

限制傳回父項節點的資料列數。

• Limit
|  limit: 10
|  records returned: 1

偏移

略過子節點產生的一組資料列。

• Offset
|  offset: 10
|  records returned: 1

捨棄

從子節點產生的結果中捨棄一組指定欄位。

• Drop
|  fields to drop: [__key__]
|  records returned: 1