查詢執行參考資料
本頁說明使用「查詢說明」執行的查詢輸出內容。 如要瞭解如何使用查詢說明功能執行查詢,請參閱「使用查詢說明功能分析查詢執行作業」。常見概念
執行樹狀結構會使用下列常見概念和術語。
資料列和記錄
「列」和「記錄」這兩個詞彙一般是指文件或索引項目。
變數
執行節點中可能會出現下列內部變數:
__key__
- 索引鍵是文件的內部 ID。這是專案、資料庫和文件完整路徑的絕對專屬 ID。__id__
:ID 是集合中文件的專屬 ID。 在單一集合中不得重複。__$0__…__$N__
- 這些是內容專屬變數,會在執行樹狀結構中建立或參照。這些變數通常用於參照文件內容,或是在查詢執行期間評估運算式的值。
舉例來說,假設您使用擴充節點從文件 __key__
擷取 __id__
:
Extend
| expressions: [_id(__key__) AS __id__]
| 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
欄位值會對應至變數 __$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
代表動態掃描,傳回的資料列可能不在單一連續索引範圍內,且必須執行多個不同的掃描才能滿足查詢。
舉例來說,如果查詢中存在 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: [__$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
完整掃描收藏內容,但掃描結果未排序。在執行查詢時,如果沒有相關聯的索引,就會使用這個選項。
順序可以是 STABLE
或 UNDEFINED
,其中 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