本頁說明使用「查詢說明」執行的查詢輸出內容。如要瞭解如何使用查詢說明功能執行查詢,請參閱「使用查詢說明功能分析查詢執行作業」。
常見概念
執行樹狀結構會使用下列常見概念和術語。
資料列和記錄
「列」和「記錄」這兩個詞彙一般是指文件或索引項目。
變數
$
表示變數,該變數是在執行樹狀結構中建立或參照。例如:$foo_1
。這些變數通常用於參照文件內容,或是在查詢執行期間評估運算式的結果。
執行節點中可能會出現下列內部變數:
$__key__
- 索引鍵是文件的內部 ID。這是專案、資料庫和文件完整路徑的絕對專屬 ID。$__id__
:ID 是集合中文件的專屬 ID。 在單一集合中不得重複。
假設使用 Compute
節點從文件 __key__
計算 __id__
:
Compute
| $__id__1: _id($__key__)
| records returned: 1
限制和範圍
部分掃描節點會使用 constraints
和 ranges
屬性,說明掃描的值範圍。這些屬性使用範圍樹狀結構格式,其中包含值清單。這些值對應於索引定義中顯示的鍵排序清單。舉例來說,樹狀結構中顯示的第一個範圍 (此處為 (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
代表動態掃描,傳回的資料列可能不在單一連續索引範圍內,且必須執行多個不同的掃描才能滿足查詢。
舉例來說,如果查詢中存在 a
且 b
等於 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
完整掃描收藏內容,但掃描結果未排序。在執行查詢時,如果沒有相關聯的索引,就會使用這個選項。
順序可以是 STABLE
或 UNDEFINED
,其中 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