查詢執行參考資料

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

常見概念

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

資料列和記錄

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

變數

$ 表示變數,該變數是在執行樹狀結構中建立或參照。例如:$foo_1。這些變數通常用於參照文件內容,或是在查詢執行期間評估運算式的結果。

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

  • $__key__- 索引鍵是文件的內部 ID。這是專案、資料庫和文件完整路徑的絕對專屬 ID。
  • $__id__:ID 是集合中文件的專屬 ID。 在單一集合中不得重複。

假設使用 Compute 節點從文件 __key__ 計算 __id__

Compute
    |  $__id__1: _id($__key__)
    |  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 欄位值會對應至變數 $user_1,而 date_placed 的值則會對應至 $date_placed_1

index: type=CollectionGroupIndex, id=CICAgOjXh4EK, keys=[user ASC, date_placed ASC, __key__ ASC]
keys: [user ASC, date_placed ASC, __key__ 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: [user ASC, quantity 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: [user ASC, date_placed 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: [user ASC, date_placed 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

LookupById

透過 ID 查詢外來集合中的文件,執行聯結作業。要查閱的 ID 來自輸入文件中的欄位。查閱結果會以新欄位形式新增至輸入文件。

• LookupById
|  local_field: $localField_1
|  foreign_datasource: (default)#/**/foreign
|  output: $output_1

TableScan

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

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

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

HashAggregate

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

• HashAggregate
|  aggregations: [sum($b_1) AS total]
|  groups: [$a_1]
|  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_1) 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

運算

評估一組運算式,並將結果指派給一組變數。

• Compute
|  $user_1: user
|  $full_name_1: str_concat($first_name_1, " ", $last_name_1)
|  $address_1: UNSET
|  records returned: 1

篩選器

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

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

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

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

Unnest

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

• Unnest
|  expression: foo AS unnested_foo

限制

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

• Limit
|  limit: 10
|  records returned: 1

偏移

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

• Offset
|  offset: 10
|  records returned: 1