@quereus/quereus 4.15.2 → 4.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/core/database-auto-analyze.d.ts +258 -0
- package/dist/src/core/database-auto-analyze.d.ts.map +1 -0
- package/dist/src/core/database-auto-analyze.js +616 -0
- package/dist/src/core/database-auto-analyze.js.map +1 -0
- package/dist/src/core/database-materialized-views.d.ts +42 -1
- package/dist/src/core/database-materialized-views.d.ts.map +1 -1
- package/dist/src/core/database-materialized-views.js +76 -3
- package/dist/src/core/database-materialized-views.js.map +1 -1
- package/dist/src/core/database-transaction.d.ts +17 -0
- package/dist/src/core/database-transaction.d.ts.map +1 -1
- package/dist/src/core/database-transaction.js +37 -0
- package/dist/src/core/database-transaction.js.map +1 -1
- package/dist/src/core/database.d.ts +8 -1
- package/dist/src/core/database.d.ts.map +1 -1
- package/dist/src/core/database.js +135 -5
- package/dist/src/core/database.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/planner/analysis/change-scope.d.ts.map +1 -1
- package/dist/src/planner/analysis/change-scope.js +8 -8
- package/dist/src/planner/analysis/change-scope.js.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.d.ts.map +1 -1
- package/dist/src/planner/analysis/constraint-extractor.js +27 -14
- package/dist/src/planner/analysis/constraint-extractor.js.map +1 -1
- package/dist/src/planner/analysis/expression-fingerprint.d.ts.map +1 -1
- package/dist/src/planner/analysis/expression-fingerprint.js +23 -2
- package/dist/src/planner/analysis/expression-fingerprint.js.map +1 -1
- package/dist/src/planner/analysis/mv-body-functions.d.ts +46 -0
- package/dist/src/planner/analysis/mv-body-functions.d.ts.map +1 -0
- package/dist/src/planner/analysis/mv-body-functions.js +65 -0
- package/dist/src/planner/analysis/mv-body-functions.js.map +1 -0
- package/dist/src/planner/analysis/predicate-shape.d.ts +32 -4
- package/dist/src/planner/analysis/predicate-shape.d.ts.map +1 -1
- package/dist/src/planner/analysis/predicate-shape.js +37 -5
- package/dist/src/planner/analysis/predicate-shape.js.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts +2 -2
- package/dist/src/planner/analysis/query-rewrite-matcher.d.ts.map +1 -1
- package/dist/src/planner/analysis/query-rewrite-matcher.js +46 -6
- package/dist/src/planner/analysis/query-rewrite-matcher.js.map +1 -1
- package/dist/src/planner/analysis/sat-checker.js +2 -5
- package/dist/src/planner/analysis/sat-checker.js.map +1 -1
- package/dist/src/planner/building/select-aggregates.d.ts +17 -5
- package/dist/src/planner/building/select-aggregates.d.ts.map +1 -1
- package/dist/src/planner/building/select-aggregates.js +122 -79
- package/dist/src/planner/building/select-aggregates.js.map +1 -1
- package/dist/src/planner/building/select-modifiers.d.ts +1 -1
- package/dist/src/planner/building/select.d.ts.map +1 -1
- package/dist/src/planner/building/select.js +73 -55
- package/dist/src/planner/building/select.js.map +1 -1
- package/dist/src/planner/cost/index.d.ts +14 -0
- package/dist/src/planner/cost/index.d.ts.map +1 -1
- package/dist/src/planner/cost/index.js +19 -0
- package/dist/src/planner/cost/index.js.map +1 -1
- package/dist/src/planner/nodes/limit-offset.d.ts.map +1 -1
- package/dist/src/planner/nodes/limit-offset.js +3 -2
- package/dist/src/planner/nodes/limit-offset.js.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.d.ts.map +1 -1
- package/dist/src/planner/nodes/table-access-nodes.js +31 -7
- package/dist/src/planner/nodes/table-access-nodes.js.map +1 -1
- package/dist/src/planner/optimizer-tuning.d.ts +10 -6
- package/dist/src/planner/optimizer-tuning.d.ts.map +1 -1
- package/dist/src/planner/optimizer-tuning.js.map +1 -1
- package/dist/src/planner/optimizer.d.ts.map +1 -1
- package/dist/src/planner/optimizer.js +24 -0
- package/dist/src/planner/optimizer.js.map +1 -1
- package/dist/src/planner/rules/access/rule-monotonic-range-access.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js +8 -4
- package/dist/src/planner/rules/access/rule-monotonic-range-access.js.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts +14 -0
- package/dist/src/planner/rules/access/rule-select-access-path.d.ts.map +1 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js +5 -1
- package/dist/src/planner/rules/access/rule-select-access-path.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts +3 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.d.ts.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js +8 -3
- package/dist/src/planner/rules/aggregate/rule-groupby-fd-simplification.js.map +1 -1
- package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.d.ts +47 -0
- package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.d.ts.map +1 -0
- package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.js +200 -0
- package/dist/src/planner/rules/aggregate/rule-minmax-index-boundary.js.map +1 -0
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts +29 -0
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.d.ts.map +1 -1
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js +55 -16
- package/dist/src/planner/rules/cache/rule-nested-loop-right-cache.js.map +1 -1
- package/dist/src/planner/rules/join/index-nested-loop.d.ts +96 -22
- package/dist/src/planner/rules/join/index-nested-loop.d.ts.map +1 -1
- package/dist/src/planner/rules/join/index-nested-loop.js +401 -82
- package/dist/src/planner/rules/join/index-nested-loop.js.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts +20 -0
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js +23 -4
- package/dist/src/planner/rules/join/rule-fanout-batched-outer.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js +7 -0
- package/dist/src/planner/rules/join/rule-join-greedy-commute.js.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts +19 -2
- package/dist/src/planner/rules/join/rule-join-physical-selection.d.ts.map +1 -1
- package/dist/src/planner/rules/join/rule-join-physical-selection.js +262 -40
- package/dist/src/planner/rules/join/rule-join-physical-selection.js.map +1 -1
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.d.ts.map +1 -1
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js +2 -1
- package/dist/src/planner/rules/predicate/rule-sargable-range-rewrite.js.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts +21 -0
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.d.ts.map +1 -1
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js +24 -6
- package/dist/src/planner/rules/retrieve/rule-grow-retrieve.js.map +1 -1
- package/dist/src/planner/rules/shared/access-leaf.d.ts +12 -12
- package/dist/src/planner/rules/shared/access-leaf.d.ts.map +1 -1
- package/dist/src/planner/rules/shared/access-leaf.js +3 -14
- package/dist/src/planner/rules/shared/access-leaf.js.map +1 -1
- package/dist/src/planner/stats/analyze.d.ts.map +1 -1
- package/dist/src/planner/stats/analyze.js +9 -3
- package/dist/src/planner/stats/analyze.js.map +1 -1
- package/dist/src/planner/stats/catalog-stats.d.ts.map +1 -1
- package/dist/src/planner/stats/catalog-stats.js +6 -10
- package/dist/src/planner/stats/catalog-stats.js.map +1 -1
- package/dist/src/planner/type-utils.d.ts.map +1 -1
- package/dist/src/planner/type-utils.js +3 -5
- package/dist/src/planner/type-utils.js.map +1 -1
- package/dist/src/planner/util/fd-utils.d.ts.map +1 -1
- package/dist/src/planner/util/fd-utils.js +4 -7
- package/dist/src/planner/util/fd-utils.js.map +1 -1
- package/dist/src/runtime/emit/alter-table.d.ts.map +1 -1
- package/dist/src/runtime/emit/alter-table.js +58 -4
- package/dist/src/runtime/emit/alter-table.js.map +1 -1
- package/dist/src/runtime/emit/analyze.d.ts.map +1 -1
- package/dist/src/runtime/emit/analyze.js +1 -2
- package/dist/src/runtime/emit/analyze.js.map +1 -1
- package/dist/src/runtime/emit/binary.d.ts.map +1 -1
- package/dist/src/runtime/emit/binary.js +5 -3
- package/dist/src/runtime/emit/binary.js.map +1 -1
- package/dist/src/runtime/emit/fanout-lookup-join.d.ts.map +1 -1
- package/dist/src/runtime/emit/fanout-lookup-join.js +9 -1
- package/dist/src/runtime/emit/fanout-lookup-join.js.map +1 -1
- package/dist/src/runtime/emit/limit-offset.d.ts.map +1 -1
- package/dist/src/runtime/emit/limit-offset.js +50 -24
- package/dist/src/runtime/emit/limit-offset.js.map +1 -1
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts +33 -2
- package/dist/src/runtime/emit/materialized-view-helpers.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view-helpers.js +61 -5
- package/dist/src/runtime/emit/materialized-view-helpers.js.map +1 -1
- package/dist/src/runtime/emit/materialized-view.d.ts.map +1 -1
- package/dist/src/runtime/emit/materialized-view.js +6 -1
- package/dist/src/runtime/emit/materialized-view.js.map +1 -1
- package/dist/src/runtime/emit/ordinal-slice.d.ts.map +1 -1
- package/dist/src/runtime/emit/ordinal-slice.js +8 -0
- package/dist/src/runtime/emit/ordinal-slice.js.map +1 -1
- package/dist/src/schema/derivation.d.ts +15 -1
- package/dist/src/schema/derivation.d.ts.map +1 -1
- package/dist/src/schema/derivation.js.map +1 -1
- package/dist/src/schema/function.d.ts +9 -4
- package/dist/src/schema/function.d.ts.map +1 -1
- package/dist/src/schema/function.js +11 -9
- package/dist/src/schema/function.js.map +1 -1
- package/dist/src/schema/schema.d.ts +14 -3
- package/dist/src/schema/schema.d.ts.map +1 -1
- package/dist/src/schema/schema.js +20 -2
- package/dist/src/schema/schema.js.map +1 -1
- package/dist/src/schema/table.d.ts +27 -0
- package/dist/src/schema/table.d.ts.map +1 -1
- package/dist/src/schema/table.js +55 -0
- package/dist/src/schema/table.js.map +1 -1
- package/dist/src/schema/unique-enforcement.d.ts +6 -13
- package/dist/src/schema/unique-enforcement.d.ts.map +1 -1
- package/dist/src/schema/unique-enforcement.js +8 -17
- package/dist/src/schema/unique-enforcement.js.map +1 -1
- package/dist/src/util/comparison.d.ts +19 -0
- package/dist/src/util/comparison.d.ts.map +1 -1
- package/dist/src/util/comparison.js +22 -0
- package/dist/src/util/comparison.js.map +1 -1
- package/dist/src/vtab/best-access-plan.d.ts +34 -0
- package/dist/src/vtab/best-access-plan.d.ts.map +1 -1
- package/dist/src/vtab/best-access-plan.js +64 -0
- package/dist/src/vtab/best-access-plan.js.map +1 -1
- package/dist/src/vtab/index-descriptor.d.ts +9 -0
- package/dist/src/vtab/index-descriptor.d.ts.map +1 -1
- package/dist/src/vtab/index-descriptor.js +15 -0
- package/dist/src/vtab/index-descriptor.js.map +1 -1
- package/dist/src/vtab/memory/layer/manager.d.ts +11 -9
- package/dist/src/vtab/memory/layer/manager.d.ts.map +1 -1
- package/dist/src/vtab/memory/layer/manager.js +12 -43
- package/dist/src/vtab/memory/layer/manager.js.map +1 -1
- package/dist/src/vtab/memory/module.d.ts +18 -0
- package/dist/src/vtab/memory/module.d.ts.map +1 -1
- package/dist/src/vtab/memory/module.js +176 -24
- package/dist/src/vtab/memory/module.js.map +1 -1
- package/dist/src/vtab/memory/table.d.ts +27 -3
- package/dist/src/vtab/memory/table.d.ts.map +1 -1
- package/dist/src/vtab/memory/table.js +28 -59
- package/dist/src/vtab/memory/table.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-nested-loop.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/index-nested-loop.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-nested-loop.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/index-nested-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,8 +67,28 @@
|
|
|
67
67
|
*
|
|
68
68
|
* **Idempotence.** After the rewrite `outerMode === 'batched'`, so a second
|
|
69
69
|
* firing returns null immediately.
|
|
70
|
+
*
|
|
71
|
+
* **Two callers, one flip.** The gates, the prefetch wrap and the node rebuild
|
|
72
|
+
* live in {@link toBatchedOuter}; this rule is a thin wrapper over it, and
|
|
73
|
+
* `rule-join-physical-selection` calls it directly to turn an index-nested-loop
|
|
74
|
+
* candidate into a priced one-branch batched fan-out. One owner means the two
|
|
75
|
+
* callers cannot drift, and — because a one-branch fan-out left in serial mode
|
|
76
|
+
* is strictly worse than the join it replaces (per-row forking, no overlap) —
|
|
77
|
+
* the selection rule never enters a serial fan-out into its comparison: if
|
|
78
|
+
* this function declines, there is no batched candidate at all.
|
|
70
79
|
*/
|
|
71
80
|
import type { OptContext } from '../../framework/context.js';
|
|
81
|
+
import type { OptimizerTuning } from '../../optimizer-tuning.js';
|
|
72
82
|
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
83
|
+
import { FanOutLookupJoinNode } from '../../nodes/fanout-lookup-join-node.js';
|
|
84
|
+
/**
|
|
85
|
+
* The serial→batched flip: every gate, the `EagerPrefetchNode` wrap and the
|
|
86
|
+
* node rebuild, in one function so no caller can obtain batched mode without
|
|
87
|
+
* the wrap (the wrap is load-bearing correctness — see the module comment's
|
|
88
|
+
* *Outer-source isolation*). Returns null when any gate declines, including on
|
|
89
|
+
* a node that is already batched (idempotence — `ruleFanOutBatchedOuter` later
|
|
90
|
+
* re-visits nodes `rule-join-physical-selection` already flipped).
|
|
91
|
+
*/
|
|
92
|
+
export declare function toBatchedOuter(node: FanOutLookupJoinNode, tuning: OptimizerTuning['parallel']): FanOutLookupJoinNode | null;
|
|
73
93
|
export declare function ruleFanOutBatchedOuter(node: PlanNode, context: OptContext): PlanNode | null;
|
|
74
94
|
//# sourceMappingURL=rule-fanout-batched-outer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-fanout-batched-outer.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-fanout-batched-outer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"rule-fanout-batched-outer.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-fanout-batched-outer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAE7E,OAAO,EAAE,oBAAoB,EAAqB,MAAM,wCAAwC,CAAC;AAwBjG;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,oBAAoB,EAC1B,MAAM,EAAE,eAAe,CAAC,UAAU,CAAC,GACjC,oBAAoB,GAAG,IAAI,CA4D7B;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAG3F"}
|
|
@@ -67,6 +67,15 @@
|
|
|
67
67
|
*
|
|
68
68
|
* **Idempotence.** After the rewrite `outerMode === 'batched'`, so a second
|
|
69
69
|
* firing returns null immediately.
|
|
70
|
+
*
|
|
71
|
+
* **Two callers, one flip.** The gates, the prefetch wrap and the node rebuild
|
|
72
|
+
* live in {@link toBatchedOuter}; this rule is a thin wrapper over it, and
|
|
73
|
+
* `rule-join-physical-selection` calls it directly to turn an index-nested-loop
|
|
74
|
+
* candidate into a priced one-branch batched fan-out. One owner means the two
|
|
75
|
+
* callers cannot drift, and — because a one-branch fan-out left in serial mode
|
|
76
|
+
* is strictly worse than the join it replaces (per-row forking, no overlap) —
|
|
77
|
+
* the selection rule never enters a serial fan-out into its comparison: if
|
|
78
|
+
* this function declines, there is no batched candidate at all.
|
|
70
79
|
*/
|
|
71
80
|
import { createLogger } from '../../../common/logger.js';
|
|
72
81
|
import { PlanNodeType } from '../../nodes/plan-node-type.js';
|
|
@@ -93,12 +102,17 @@ function outerRowEstimate(node) {
|
|
|
93
102
|
return outerRowEstimate(relations[0]);
|
|
94
103
|
return undefined;
|
|
95
104
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
105
|
+
/**
|
|
106
|
+
* The serial→batched flip: every gate, the `EagerPrefetchNode` wrap and the
|
|
107
|
+
* node rebuild, in one function so no caller can obtain batched mode without
|
|
108
|
+
* the wrap (the wrap is load-bearing correctness — see the module comment's
|
|
109
|
+
* *Outer-source isolation*). Returns null when any gate declines, including on
|
|
110
|
+
* a node that is already batched (idempotence — `ruleFanOutBatchedOuter` later
|
|
111
|
+
* re-visits nodes `rule-join-physical-selection` already flipped).
|
|
112
|
+
*/
|
|
113
|
+
export function toBatchedOuter(node, tuning) {
|
|
99
114
|
if (node.outerMode === 'batched')
|
|
100
115
|
return null; // idempotence
|
|
101
|
-
const tuning = context.tuning.parallel;
|
|
102
116
|
const branchCount = node.branches.length;
|
|
103
117
|
// Cross-branch batched outer is owned by the cross-mode ticket; only flip
|
|
104
118
|
// clusters whose branches are all at-most-one. `cross-left` is a 1:n cross
|
|
@@ -146,4 +160,9 @@ export function ruleFanOutBatchedOuter(node, context) {
|
|
|
146
160
|
log('Flipping FanOutLookupJoin %s to batched outer mode (branches=%d, maxLatency=%d ms, outerRows=%s, globalCap=%d)', node.id, branchCount, maxLatency, String(outerRows), tuning.outerBatchConcurrency);
|
|
147
161
|
return new FanOutLookupJoinNode(node.scope, outer, node.branches, node.concurrencyCap, node.preserveAttributeIds, 'batched');
|
|
148
162
|
}
|
|
163
|
+
export function ruleFanOutBatchedOuter(node, context) {
|
|
164
|
+
if (!(node instanceof FanOutLookupJoinNode))
|
|
165
|
+
return null;
|
|
166
|
+
return toBatchedOuter(node, context.tuning.parallel);
|
|
167
|
+
}
|
|
149
168
|
//# sourceMappingURL=rule-fanout-batched-outer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-fanout-batched-outer.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-fanout-batched-outer.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"rule-fanout-batched-outer.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-fanout-batched-outer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-join-greedy-commute.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAe7D;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"rule-join-greedy-commute.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAC;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAe7D;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAqD3F"}
|
|
@@ -42,6 +42,13 @@ export function ruleJoinGreedyCommute(node, _context) {
|
|
|
42
42
|
log('join-greedy-commute skipped: a side has side effects');
|
|
43
43
|
return null;
|
|
44
44
|
}
|
|
45
|
+
// NOTE: this row-count arm reads the LOGICAL `estimatedRows` getter, which the
|
|
46
|
+
// physical access nodes (Alias / Retrieve / IndexScan …) do not define — so for
|
|
47
|
+
// table-backed inputs both sides read Infinity and `rightRows < leftRows` never
|
|
48
|
+
// holds; only the singleton-FD arm below fires for them. Tracked by
|
|
49
|
+
// backlog/bug-row-estimate-conflates-unknown-and-zero (fix it there, via
|
|
50
|
+
// `physicalSourceRows`). Two-table joins get their orientation decided later in
|
|
51
|
+
// rule-join-physical-selection's index-nested-loop seek-side election instead.
|
|
45
52
|
const leftRows = node.getLeftSource().estimatedRows ?? Number.POSITIVE_INFINITY;
|
|
46
53
|
const rightRows = node.getRightSource().estimatedRows ?? Number.POSITIVE_INFINITY;
|
|
47
54
|
// Prefer known finite estimatedRows; also detect <=1 row driver on either side
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-join-greedy-commute.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,MAAM,GAAG,GAAG,YAAY,CAAC,oCAAoC,CAAC,CAAC;AAE/D,6DAA6D;AAC7D,SAAS,WAAW,CAAC,IAAwB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC;IAC7C,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,aAAa,KAAK,CAAC,CAAC;IAC9D,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAc,EAAE,QAAoB;IACxE,IAAI,CAAC,CAAC,IAAI,YAAY,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAExE,qEAAqE;IACrE,+EAA+E;IAC/E,8EAA8E;IAC9E,+EAA+E;IAC/E,gFAAgF;IAChF,yDAAyD;IACzD,IAAI,oBAAoB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAwB,CAAC;WACxF,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAwB,CAAC,EAAE,CAAC;QAChG,GAAG,CAAC,sDAAsD,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,aAAa,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAChF,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAElF,+EAA+E;IAC/E,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAE5D,kEAAkE;IAClE,MAAM,UAAU,GAAG,CAAC,gBAAgB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,eAAe,IAAI,SAAS,GAAG,QAAQ,CAAC,CAAC;IAC7H,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,GAAG,CAAC,wFAAwF,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnI,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,QAAQ,CAC1B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,cAAc,EAAwB,EAC3C,IAAI,CAAC,aAAa,EAAwB,EAC1C,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,eAAe,EAAE,CACvB,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"rule-join-greedy-commute.js","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-greedy-commute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,MAAM,GAAG,GAAG,YAAY,CAAC,oCAAoC,CAAC,CAAC;AAE/D,6DAA6D;AAC7D,SAAS,WAAW,CAAC,IAAwB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC;IAC7C,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,EAAE,aAAa,KAAK,CAAC,CAAC;IAC9D,OAAO,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAc,EAAE,QAAoB;IACxE,IAAI,CAAC,CAAC,IAAI,YAAY,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IAExE,qEAAqE;IACrE,+EAA+E;IAC/E,8EAA8E;IAC9E,+EAA+E;IAC/E,gFAAgF;IAChF,yDAAyD;IACzD,IAAI,oBAAoB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC;QAC9F,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,IAAI,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,EAAwB,CAAC;WACxF,uBAAuB,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,EAAwB,CAAC,EAAE,CAAC;QAChG,GAAG,CAAC,sDAAsD,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+EAA+E;IAC/E,gFAAgF;IAChF,gFAAgF;IAChF,oEAAoE;IACpE,yEAAyE;IACzE,gFAAgF;IAChF,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,aAAa,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAChF,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC,aAAa,IAAI,MAAM,CAAC,iBAAiB,CAAC;IAElF,+EAA+E;IAC/E,MAAM,eAAe,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAE5D,kEAAkE;IAClE,MAAM,UAAU,GAAG,CAAC,gBAAgB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,eAAe,IAAI,SAAS,GAAG,QAAQ,CAAC,CAAC;IAC7H,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,GAAG,CAAC,wFAAwF,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnI,qEAAqE;IACrE,MAAM,OAAO,GAAG,IAAI,QAAQ,CAC1B,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,cAAc,EAAwB,EAC3C,IAAI,CAAC,aAAa,EAAwB,EAC1C,IAAI,CAAC,WAAW,EAAE,EAClB,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,eAAe,EAAE,CACvB,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -13,8 +13,25 @@
|
|
|
13
13
|
* `index-nested-loop.ts`) is cheaper than the plain nested loop
|
|
14
14
|
*
|
|
15
15
|
* Benefits: Replaces the O(n*m) nested loop with an O(n+m) hash/merge join, or
|
|
16
|
-
* with an O(n·seek) index-nested-loop when
|
|
17
|
-
*
|
|
16
|
+
* with an O(n·seek) index-nested-loop when one side's module can answer an
|
|
17
|
+
* equality seek on the join key. For an INNER join the index-nested-loop is
|
|
18
|
+
* offered in BOTH orientations (seek the right driven by the left, and the
|
|
19
|
+
* mirror: seek the left driven by the right) and the cheaper wins — this rule
|
|
20
|
+
* is the only place a two-table join's orientation can be decided with the
|
|
21
|
+
* module's own seek-versus-scan answers in hand (`rule-join-greedy-commute`'s
|
|
22
|
+
* row-count arm never fires for table-backed inputs, and QuickPick returns
|
|
23
|
+
* immediately for fewer than three relations).
|
|
24
|
+
*
|
|
25
|
+
* Each index-nested-loop orientation whose seek PROVABLY returns at most one
|
|
26
|
+
* row per outer row (`IndexNestedLoopCandidate.atMostOne`) is additionally
|
|
27
|
+
* offered as a one-branch `FanOutLookupJoinNode` in `batched` outer mode —
|
|
28
|
+
* the same seek, driven by the fan-out's cross-row pipelined runtime so many
|
|
29
|
+
* seeks are in flight at once and a high-latency module's round trip is
|
|
30
|
+
* amortized across them. The decision is made HERE, as a priced candidate,
|
|
31
|
+
* not by a later rewrite rule: a post-pass would only ever see index-NL joins
|
|
32
|
+
* that already won at one-seek-at-a-time prices, and under latency those
|
|
33
|
+
* mostly lose to hash join. Batching changes the price, so the price has to
|
|
34
|
+
* be in the comparison. See `tryBatchedIndexNestedLoop`.
|
|
18
35
|
*/
|
|
19
36
|
import type { PlanNode } from '../../nodes/plan-node.js';
|
|
20
37
|
import type { OptContext } from '../../framework/context.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-join-physical-selection.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"rule-join-physical-selection.d.ts","sourceRoot":"","sources":["../../../../../src/planner/rules/join/rule-join-physical-selection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAiD,MAAM,0BAA0B,CAAC;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AA8M7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAkV9F"}
|
|
@@ -13,22 +13,166 @@
|
|
|
13
13
|
* `index-nested-loop.ts`) is cheaper than the plain nested loop
|
|
14
14
|
*
|
|
15
15
|
* Benefits: Replaces the O(n*m) nested loop with an O(n+m) hash/merge join, or
|
|
16
|
-
* with an O(n·seek) index-nested-loop when
|
|
17
|
-
*
|
|
16
|
+
* with an O(n·seek) index-nested-loop when one side's module can answer an
|
|
17
|
+
* equality seek on the join key. For an INNER join the index-nested-loop is
|
|
18
|
+
* offered in BOTH orientations (seek the right driven by the left, and the
|
|
19
|
+
* mirror: seek the left driven by the right) and the cheaper wins — this rule
|
|
20
|
+
* is the only place a two-table join's orientation can be decided with the
|
|
21
|
+
* module's own seek-versus-scan answers in hand (`rule-join-greedy-commute`'s
|
|
22
|
+
* row-count arm never fires for table-backed inputs, and QuickPick returns
|
|
23
|
+
* immediately for fewer than three relations).
|
|
24
|
+
*
|
|
25
|
+
* Each index-nested-loop orientation whose seek PROVABLY returns at most one
|
|
26
|
+
* row per outer row (`IndexNestedLoopCandidate.atMostOne`) is additionally
|
|
27
|
+
* offered as a one-branch `FanOutLookupJoinNode` in `batched` outer mode —
|
|
28
|
+
* the same seek, driven by the fan-out's cross-row pipelined runtime so many
|
|
29
|
+
* seeks are in flight at once and a high-latency module's round trip is
|
|
30
|
+
* amortized across them. The decision is made HERE, as a priced candidate,
|
|
31
|
+
* not by a later rewrite rule: a post-pass would only ever see index-NL joins
|
|
32
|
+
* that already won at one-seek-at-a-time prices, and under latency those
|
|
33
|
+
* mostly lose to hash join. Batching changes the price, so the price has to
|
|
34
|
+
* be in the comparison. See `tryBatchedIndexNestedLoop`.
|
|
18
35
|
*/
|
|
19
36
|
import { createLogger } from '../../../common/logger.js';
|
|
20
37
|
import { JoinNode } from '../../nodes/join-node.js';
|
|
21
38
|
import { BloomJoinNode } from '../../nodes/bloom-join-node.js';
|
|
22
39
|
import { MergeJoinNode } from '../../nodes/merge-join-node.js';
|
|
23
40
|
import { SortNode } from '../../nodes/sort.js';
|
|
41
|
+
import { FilterNode } from '../../nodes/filter.js';
|
|
24
42
|
import { ColumnReferenceNode } from '../../nodes/reference.js';
|
|
25
|
-
import {
|
|
43
|
+
import { FanOutLookupJoinNode } from '../../nodes/fanout-lookup-join-node.js';
|
|
44
|
+
import { nestedLoopJoinCost, hashJoinCost, mergeJoinCost, batchedIndexNestedLoopJoinCost, } from '../../cost/index.js';
|
|
45
|
+
import { toBatchedOuter } from './rule-fanout-batched-outer.js';
|
|
26
46
|
import { extractEquiPairs, isOrderedOnEquiPairs, reorderEquiPairsForMerge, } from './equi-pair-extractor.js';
|
|
27
47
|
import { PlanNodeCharacteristics } from '../../framework/characteristics.js';
|
|
28
48
|
import { readsColumnsOf } from '../../cache/correlation-detector.js';
|
|
29
49
|
import { physicalSourceRows } from '../../util/row-estimates.js';
|
|
30
50
|
import { tryIndexNestedLoop } from './index-nested-loop.js';
|
|
51
|
+
import { nestedLoopRightOpensOnce } from '../cache/rule-nested-loop-right-cache.js';
|
|
31
52
|
const log = createLogger('optimizer:rule:join-physical-selection');
|
|
53
|
+
/** Flip every pair so left=old right / right=old left; spread keeps the collation flags. */
|
|
54
|
+
function mirrorEquiPairs(pairs) {
|
|
55
|
+
return pairs.map(p => ({ ...p, leftAttrId: p.rightAttrId, rightAttrId: p.leftAttrId }));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Whether the index-nested-loop may also be tried with the sides exchanged
|
|
59
|
+
* (seek the LEFT input, drive from the right). Only a plain inner join
|
|
60
|
+
* commutes: `left` / `semi` / `anti` are left-driven by definition (a mirrored
|
|
61
|
+
* `left` join is a `right` join, which the emitter drives from the other
|
|
62
|
+
* side); an `exists … as` join appends its flag columns after both sides with
|
|
63
|
+
* a resolved `side` per flag, so a swap would have to flip and re-derive them
|
|
64
|
+
* — excluded rather than attempted. A write in either subtree forbids the swap
|
|
65
|
+
* because it reorders user-visible execution — the same refusal the hash
|
|
66
|
+
* build/probe swap makes below.
|
|
67
|
+
*/
|
|
68
|
+
function mayMirrorIndexNestedLoop(node) {
|
|
69
|
+
return node.joinType === 'inner'
|
|
70
|
+
&& !node.hasExistenceColumns
|
|
71
|
+
&& !PlanNodeCharacteristics.subtreeHasSideEffects(node.left)
|
|
72
|
+
&& !PlanNodeCharacteristics.subtreeHasSideEffects(node.right);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* First-row latency the PLAIN nested loop pays for opening its inner (right)
|
|
76
|
+
* side: once if that side is opened once per join — already materialized, or
|
|
77
|
+
* about to be wrapped in a `CacheNode` by `rule-nested-loop-right-cache` — and
|
|
78
|
+
* otherwise once per outer row, because the emitter re-opens the inner pipeline
|
|
79
|
+
* for every left row.
|
|
80
|
+
*
|
|
81
|
+
* That question belongs to the cache rule and is answered by its own exported
|
|
82
|
+
* predicate; this rule must never restate the gates behind it. Note it is the
|
|
83
|
+
* open-count question, NOT plain cacheability: this rule re-visits a join the
|
|
84
|
+
* cache rule has already rewritten, and on that visit the right side is cached
|
|
85
|
+
* (so it opens once) while `canCacheNestedLoopRight` reports false (so there is
|
|
86
|
+
* nothing left to wrap).
|
|
87
|
+
*
|
|
88
|
+
* NOTE: the predicate partly describes rules that have not run yet, and answers
|
|
89
|
+
* two cases pessimistically/optimistically:
|
|
90
|
+
* - An impure right side that `mutating-subquery-cache` (also later in this
|
|
91
|
+
* pass) will wrap reads as "opens per row" through the purity gate, so the
|
|
92
|
+
* plain nested loop is over-charged. Unreachable in practice —
|
|
93
|
+
* index-nested-loop declines an impure inner outright and the hash
|
|
94
|
+
* build/probe swap refuses too, so the over-charge has no cheaper rival to
|
|
95
|
+
* hand the win to. If a candidate that tolerates an impure inner ever
|
|
96
|
+
* appears, teach the predicate about the mutating-subquery rule rather than
|
|
97
|
+
* duplicating its gates here.
|
|
98
|
+
* - A semi/anti join breaks out of the inner scan on the first match, so its
|
|
99
|
+
* cache buffer only lands after the first UNMATCHED outer row (see the driver
|
|
100
|
+
* gate's own NOTE): a match-heavy semi join really can re-open the inner per
|
|
101
|
+
* outer row while this charges it once. Optimistic by at most
|
|
102
|
+
* (outerRows - 1) x latency, in the same direction the work term is already
|
|
103
|
+
* pessimistic (it charges a full inner scan per outer row for a loop that
|
|
104
|
+
* breaks early). Revisit together if a high-latency module ever makes
|
|
105
|
+
* semi/anti plans regress; picking one side of the range is not obviously
|
|
106
|
+
* better than the other while both terms are this coarse.
|
|
107
|
+
*/
|
|
108
|
+
function nestedLoopInnerLatency(node, context, outerRows, innerLatencyMs) {
|
|
109
|
+
// Short-circuit before `nestedLoopRightOpensOnce`, whose size gate walks the
|
|
110
|
+
// whole right subtree: with no latency to charge the answer is 0 either way.
|
|
111
|
+
// Every in-tree module reports 0, so this keeps the walk off the hot path.
|
|
112
|
+
if (innerLatencyMs === 0)
|
|
113
|
+
return 0;
|
|
114
|
+
return nestedLoopRightOpensOnce(node, context) ? innerLatencyMs : outerRows * innerLatencyMs;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The index-nested-loop candidate re-driven as a one-branch `FanOutLookupJoinNode`
|
|
118
|
+
* in `batched` outer mode, priced — or null when this orientation has no
|
|
119
|
+
* batched candidate. Building the node and asking `toBatchedOuter`'s gates in
|
|
120
|
+
* one step is what keeps the price and the plan from ever disagreeing; a
|
|
121
|
+
* serial fan-out is never entered into the comparison (strictly worse than the
|
|
122
|
+
* join it replaces: per-row forking, no overlap).
|
|
123
|
+
*
|
|
124
|
+
* The branch is the rebuilt inner under a `Filter` carrying the join's ON
|
|
125
|
+
* condition — a fan-out branch has no residual slot, and this is the same
|
|
126
|
+
* construction `rule-fanout-lookup-join` uses for its spine branches. The
|
|
127
|
+
* condition's outer-side column references resolve through
|
|
128
|
+
* `RuntimeContext.context` exactly as the seek's own correlated keys do. A
|
|
129
|
+
* Filter cannot add rows, so it cannot break the at-most-one claim; for a LEFT
|
|
130
|
+
* join, filtering the single row away yields an empty branch, which
|
|
131
|
+
* `atMostOne-left` NULL-pads — LEFT-join semantics. `concurrencyCap` is 1: one
|
|
132
|
+
* branch; the cross-row budget is the batched driver's `outerBatchConcurrency`.
|
|
133
|
+
* `connectionKey` stays unset so the emitter falls back to the active
|
|
134
|
+
* connection, as `rule-fanout-lookup-join` does.
|
|
135
|
+
*
|
|
136
|
+
* Price: `batchedIndexNestedLoopJoinCost` with the number of seeks in flight
|
|
137
|
+
* for one branch — `min(outerBatchConcurrency, maxOuterReadAhead)`, the
|
|
138
|
+
* driver's global permit budget bounded by its read-ahead window (mirrors
|
|
139
|
+
* `deriveReadAhead` at `branchCount = 1`; see the coupling comment there) —
|
|
140
|
+
* plus one open of the outer side, the same charge the serial index-NL pays.
|
|
141
|
+
*
|
|
142
|
+
* NOTE: a `USING` join that takes this path loses its `JoinNode.usingColumns`
|
|
143
|
+
* label — the fan-out has no equivalent field, and the label only ever fed
|
|
144
|
+
* EXPLAIN's `JOIN USING(...)` rendering (`buildJoinAttributes` ignores it, so
|
|
145
|
+
* no attribute layout changes). It renders as a fan-out instead.
|
|
146
|
+
* NOTE: the row estimate changes slightly — `FanOutLookupJoinNode` reports the
|
|
147
|
+
* outer's cardinality for an at-most-one branch (an upper bound for `inner`,
|
|
148
|
+
* exact for `left`) where `JoinNode` used `estimateJoinRows`. Known, not chased.
|
|
149
|
+
*/
|
|
150
|
+
function tryBatchedIndexNestedLoop(join, outer, candidate, joinType, preserveAttrs, outerRows, outerLatencyMs, tuning) {
|
|
151
|
+
if (!candidate || !candidate.atMostOne)
|
|
152
|
+
return null;
|
|
153
|
+
// Outcome-preserving short-circuit, not a restated gate: at zero latency the
|
|
154
|
+
// batched price equals the serial one (the only term batching divides is the
|
|
155
|
+
// latency), and a strict `<` after the serial entry can never pick it — so
|
|
156
|
+
// skip building nodes the comparison could not choose. Every in-tree module
|
|
157
|
+
// reports 0, which keeps node construction off the golden-sweep hot path.
|
|
158
|
+
if (candidate.perSeekLatencyMs === 0)
|
|
159
|
+
return null;
|
|
160
|
+
const inner = candidate.newInner;
|
|
161
|
+
// `condition` is defined — the caller extracted equi pairs from it.
|
|
162
|
+
const branch = {
|
|
163
|
+
child: new FilterNode(join.scope, inner, join.condition),
|
|
164
|
+
mode: joinType === 'left' ? 'atMostOne-left' : 'atMostOne-inner',
|
|
165
|
+
outputAttrs: inner.getAttributes(),
|
|
166
|
+
concurrencySafe: inner.physical.concurrencySafe !== false,
|
|
167
|
+
};
|
|
168
|
+
const serial = new FanOutLookupJoinNode(join.scope, outer, [branch], 1, preserveAttrs, 'serial');
|
|
169
|
+
const batched = toBatchedOuter(serial, tuning);
|
|
170
|
+
if (!batched)
|
|
171
|
+
return null;
|
|
172
|
+
const inFlight = Math.min(tuning.outerBatchConcurrency, tuning.maxOuterReadAhead);
|
|
173
|
+
const cost = batchedIndexNestedLoopJoinCost(outerRows, candidate.rowsPerSeek, candidate.perSeekLatencyMs, inFlight) + outerLatencyMs;
|
|
174
|
+
return { node: batched, cost };
|
|
175
|
+
}
|
|
32
176
|
/**
|
|
33
177
|
* Create a SortNode that sorts a source on the equi-pair columns for this side.
|
|
34
178
|
*/
|
|
@@ -87,34 +231,101 @@ export function ruleJoinPhysicalSelection(node, context) {
|
|
|
87
231
|
// logical-getter read (which yielded undefined → 100).
|
|
88
232
|
const leftRows = physicalSourceRows(node.left.physical, node.left) || 100;
|
|
89
233
|
const rightRows = physicalSourceRows(node.right.physical, node.right) || 100;
|
|
90
|
-
|
|
234
|
+
// Latency accounting, applied uniformly to every candidate below: a candidate
|
|
235
|
+
// is charged ONE open of its outer side plus however many opens of its inner
|
|
236
|
+
// side it performs. `expectedLatencyMs` is a subtree's first-row latency
|
|
237
|
+
// (0 for every in-process module), treated as ms-equivalent engine cost.
|
|
238
|
+
// Charged locally here, not inside the shared cost functions, which other
|
|
239
|
+
// callers use latency-free.
|
|
240
|
+
const leftLatencyMs = node.left.physical.expectedLatencyMs ?? 0;
|
|
241
|
+
const rightLatencyMs = node.right.physical.expectedLatencyMs ?? 0;
|
|
242
|
+
// Plain nested loop: one open of the left, and one open of the right per left
|
|
243
|
+
// row unless the right side is already materialized or the cache rule is
|
|
244
|
+
// about to make it so.
|
|
245
|
+
const nlCost = nestedLoopJoinCost(leftRows, rightRows)
|
|
246
|
+
+ leftLatencyMs
|
|
247
|
+
+ nestedLoopInnerLatency(node, context, leftRows, rightLatencyMs);
|
|
91
248
|
// Index-nested-loop candidate: the logical JoinNode survives with its right
|
|
92
249
|
// leaf replaced by a per-outer-row correlated IndexSeek. Considered BEFORE
|
|
93
250
|
// the existence early-return below — index-NL keeps the nested-loop emitter
|
|
94
251
|
// (the only one that derives `exists … as` flag bits) and `withChildren`
|
|
95
252
|
// threads `existence` verbatim, so existence joins CAN take this path,
|
|
96
253
|
// unlike hash/merge which drop the appended flag column.
|
|
97
|
-
const indexNL = tryIndexNestedLoop(node, extracted.equiPairs, leftRows, context);
|
|
98
|
-
//
|
|
254
|
+
const indexNL = tryIndexNestedLoop(joinType, node.left, node.right, extracted.equiPairs, leftRows, context);
|
|
255
|
+
// Mirrored candidate: seek the LEFT input, drive from the right. Whether a
|
|
256
|
+
// table landed on the left or the right was decided long before anything
|
|
257
|
+
// knew which side had a usable index, so the un-mirrored candidate alone can
|
|
258
|
+
// read a whole table the join had a perfectly good index for. The cost
|
|
259
|
+
// formula is linear in the outer row count, so this is fed `rightRows` —
|
|
260
|
+
// the mirror is only cheap when the NEW outer is the small side.
|
|
261
|
+
const mirroredNL = mayMirrorIndexNestedLoop(node)
|
|
262
|
+
? tryIndexNestedLoop('inner', node.right, node.left, mirrorEquiPairs(extracted.equiPairs), rightRows, context)
|
|
263
|
+
: null;
|
|
264
|
+
// Each index-nested-loop orientation opens its outer side once; the per-seek
|
|
265
|
+
// charge for its INNER side is already inside `indexNestedLoopJoinCost`
|
|
266
|
+
// (`tryIndexNestedLoop` feeds it `inner.physical.expectedLatencyMs`, which is
|
|
267
|
+
// the RIGHT side's for the un-mirrored candidate and the LEFT side's for the
|
|
268
|
+
// mirror). Absent candidates cost Infinity so they never win a comparison.
|
|
269
|
+
const indexNLCost = indexNL ? indexNL.cost + leftLatencyMs : Infinity;
|
|
270
|
+
const mirroredNLCost = mirroredNL ? mirroredNL.cost + rightLatencyMs : Infinity;
|
|
271
|
+
// Rebuild with the seek-bearing inner side, KEEPING the ON condition on the
|
|
99
272
|
// join. It is redundant when the seek is exact, but it is the safety net
|
|
100
273
|
// when the seek over-fetches (a COARSER_SAFE collation cover, a module
|
|
101
274
|
// returning a superset) — and it costs one predicate evaluation per emitted
|
|
102
|
-
// row, not per scanned row.
|
|
275
|
+
// row, not per scanned row. `condition` is defined — equi pairs were
|
|
276
|
+
// extracted from it above.
|
|
103
277
|
const rebuildWithIndexNL = () => {
|
|
104
278
|
log('Selecting index-nested-loop join (cost=%.2f) for %d outer rows', indexNL.cost, leftRows);
|
|
105
|
-
|
|
106
|
-
|
|
279
|
+
return node.withChildren([node.left, indexNL.newInner, node.condition]);
|
|
280
|
+
};
|
|
281
|
+
// The mirrored rebuild is a NEW JoinNode with the children exchanged —
|
|
282
|
+
// `withChildren` re-uses the node's own slot order and cannot express the
|
|
283
|
+
// swap. The ON condition and `usingColumns` carry over verbatim: both refer
|
|
284
|
+
// to attributes by id, and `buildJoinAttributes` concatenates the two
|
|
285
|
+
// sides' Attribute objects as-is (no `preserveAttributeIds` list is passed),
|
|
286
|
+
// so the swap changes the join's attribute ORDER, never an attribute id.
|
|
287
|
+
// Order is harmless: column references resolve by id at runtime, every
|
|
288
|
+
// positional consumer derives its row descriptor from this node's own
|
|
289
|
+
// `getAttributes()` at emit time, the nested-loop emitter yields
|
|
290
|
+
// `[...leftRow, ...rightRow]` where "left" is now the old right on both
|
|
291
|
+
// sides of that equation, and `JoinNode.computePhysical` advertises no
|
|
292
|
+
// `ordering` — so no ancestor Sort was elided on the strength of the join's
|
|
293
|
+
// emission order. What DOES change is the order rows come out in for a query
|
|
294
|
+
// without ORDER BY, which is permitted (hash join already does it).
|
|
295
|
+
// `existence` is omitted: `mayMirrorIndexNestedLoop` excludes flag joins.
|
|
296
|
+
const rebuildWithMirroredNL = () => {
|
|
297
|
+
log('Selecting mirrored index-nested-loop join (cost=%.2f) for %d outer rows (sides exchanged)', mirroredNL.cost, rightRows);
|
|
298
|
+
return new JoinNode(node.scope, node.right, mirroredNL.newInner, 'inner', node.condition, node.usingColumns);
|
|
107
299
|
};
|
|
108
300
|
// A join exposing `exists … as` match flags stays the nested-loop JoinNode (the
|
|
109
301
|
// only emitter that derives the flag bit); the physical Bloom/Merge variants do
|
|
110
302
|
// not carry or emit the appended flag column, so converting would drop it. Read
|
|
111
303
|
// half: existence joins forgo hash/merge selection — documented limitation.
|
|
112
304
|
// Index-NL remains available (see above): only plain NL and index-NL compete.
|
|
305
|
+
// (`mirroredNL` is null here — the mirror gate excludes existence joins.)
|
|
113
306
|
if (node.hasExistenceColumns) {
|
|
114
|
-
if (
|
|
307
|
+
if (indexNLCost < nlCost)
|
|
115
308
|
return rebuildWithIndexNL();
|
|
116
309
|
return null;
|
|
117
310
|
}
|
|
311
|
+
// Preserve attribute IDs from the logical JoinNode. Also pins the un-mirrored
|
|
312
|
+
// batched fan-out's layout: the logical join's `[...left, ...right]` (right
|
|
313
|
+
// nullable-widened for LEFT) is exactly the fan-out's `[...outer, ...branch]`
|
|
314
|
+
// with `isLeftBranchMode` widening, so attribute identity carries verbatim.
|
|
315
|
+
const preserveAttrs = node.getAttributes().slice();
|
|
316
|
+
// Batched index-nested-loop candidates: each proved-at-most-one orientation
|
|
317
|
+
// re-driven as a one-branch batched fan-out. Only `inner` / `left` — the
|
|
318
|
+
// fan-out node has no semi/anti mode, and existence joins returned above
|
|
319
|
+
// (no existence-flag support either). The mirrored one passes no
|
|
320
|
+
// `preserveAttrs` and lets the node derive `[...right, ...leftRebuilt]`,
|
|
321
|
+
// matching what `rebuildWithMirroredNL` produces. Absent candidates cost
|
|
322
|
+
// Infinity, as above.
|
|
323
|
+
const batchedNL = joinType === 'inner' || joinType === 'left'
|
|
324
|
+
? tryBatchedIndexNestedLoop(node, node.left, indexNL, joinType, preserveAttrs, leftRows, leftLatencyMs, context.tuning.parallel)
|
|
325
|
+
: null;
|
|
326
|
+
const mirroredBatchedNL = tryBatchedIndexNestedLoop(node, node.right, mirroredNL, 'inner', undefined, rightRows, rightLatencyMs, context.tuning.parallel);
|
|
327
|
+
const batchedNLCost = batchedNL ? batchedNL.cost : Infinity;
|
|
328
|
+
const mirroredBatchedNLCost = mirroredBatchedNL ? mirroredBatchedNL.cost : Infinity;
|
|
118
329
|
// Hash join cost: build side is the smaller input
|
|
119
330
|
const buildRows = Math.min(leftRows, rightRows);
|
|
120
331
|
const probeRows = Math.max(leftRows, rightRows);
|
|
@@ -144,44 +355,60 @@ export function ruleJoinPhysicalSelection(node, context) {
|
|
|
144
355
|
const mergeCostValue = mergeAvailable
|
|
145
356
|
? mergeJoinCost(leftRows, rightRows, !leftOrdered, !rightOrdered)
|
|
146
357
|
: Infinity;
|
|
147
|
-
// Hash and merge each
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
// is deliberately left alone: it is the no-change fallback, and if it wins
|
|
152
|
-
// nothing is rewritten.
|
|
153
|
-
//
|
|
154
|
-
// NOTE: that last exemption biases against index-NL once a module reports a
|
|
155
|
-
// nonzero `expectedLatencyMs` — plain NL re-opens the right side per outer
|
|
156
|
-
// row too, so it pays the same per-seek latency but is charged none, and can
|
|
157
|
-
// win a comparison against the strictly cheaper index-NL. Harmless today
|
|
158
|
-
// (both shipped modules report 0). If a high-latency module appears, charge
|
|
159
|
-
// plain NL `outerRows * latency` here rather than dropping it from index-NL.
|
|
160
|
-
const rightLatencyMs = node.right.physical.expectedLatencyMs ?? 0;
|
|
358
|
+
// Hash and merge each open both sides exactly once (build then probe / merge
|
|
359
|
+
// two streams), so each is charged one open of each side.
|
|
360
|
+
const hashTotal = hashCostValue + leftLatencyMs + rightLatencyMs;
|
|
361
|
+
const mergeTotal = mergeCostValue + leftLatencyMs + rightLatencyMs;
|
|
161
362
|
let bestAlgo = 'nested-loop';
|
|
162
363
|
let bestCost = nlCost;
|
|
163
|
-
if (
|
|
364
|
+
if (hashTotal < bestCost) {
|
|
164
365
|
bestAlgo = 'hash';
|
|
165
|
-
bestCost =
|
|
366
|
+
bestCost = hashTotal;
|
|
166
367
|
}
|
|
167
|
-
if (
|
|
368
|
+
if (mergeTotal < bestCost) {
|
|
168
369
|
bestAlgo = 'merge';
|
|
169
|
-
bestCost =
|
|
370
|
+
bestCost = mergeTotal;
|
|
170
371
|
}
|
|
171
|
-
if (
|
|
372
|
+
if (indexNLCost < bestCost) {
|
|
172
373
|
bestAlgo = 'index-nl';
|
|
173
|
-
bestCost =
|
|
374
|
+
bestCost = indexNLCost;
|
|
375
|
+
}
|
|
376
|
+
if (batchedNLCost < bestCost) {
|
|
377
|
+
bestAlgo = 'index-nl-batched';
|
|
378
|
+
bestCost = batchedNLCost;
|
|
379
|
+
}
|
|
380
|
+
if (mirroredNLCost < bestCost) {
|
|
381
|
+
bestAlgo = 'index-nl-mirrored';
|
|
382
|
+
bestCost = mirroredNLCost;
|
|
383
|
+
}
|
|
384
|
+
if (mirroredBatchedNLCost < bestCost) {
|
|
385
|
+
bestAlgo = 'index-nl-mirrored-batched';
|
|
386
|
+
bestCost = mirroredBatchedNLCost;
|
|
174
387
|
}
|
|
388
|
+
// `%d` not `%.2f`: `debug` has no precision formatter and passes the token through verbatim.
|
|
389
|
+
const COSTS = 'nl=%d, hash=%d, merge=%d, index-nl=%d, index-nl-batched=%d, index-nl-mirrored=%d, index-nl-mirrored-batched=%d';
|
|
390
|
+
const costArgs = [nlCost, hashTotal, mergeTotal, indexNLCost, batchedNLCost, mirroredNLCost, mirroredBatchedNLCost];
|
|
175
391
|
if (bestAlgo === 'nested-loop') {
|
|
176
|
-
log(
|
|
392
|
+
log(`Nested loop cheapest (${COSTS}) for %d x %d rows`, ...costArgs, leftRows, rightRows);
|
|
177
393
|
return null;
|
|
178
394
|
}
|
|
179
395
|
if (bestAlgo === 'index-nl') {
|
|
180
396
|
return rebuildWithIndexNL();
|
|
181
397
|
}
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
398
|
+
if (bestAlgo === 'index-nl-mirrored') {
|
|
399
|
+
return rebuildWithMirroredNL();
|
|
400
|
+
}
|
|
401
|
+
// The batched node is already built — price and plan came from the same
|
|
402
|
+
// construction — so a win returns it verbatim.
|
|
403
|
+
if (bestAlgo === 'index-nl-batched') {
|
|
404
|
+
log(`Selecting batched index-nested-loop join (${COSTS}) for %d outer rows`, ...costArgs, leftRows);
|
|
405
|
+
return batchedNL.node;
|
|
406
|
+
}
|
|
407
|
+
if (bestAlgo === 'index-nl-mirrored-batched') {
|
|
408
|
+
log(`Selecting mirrored batched index-nested-loop join (${COSTS}) for %d outer rows (sides exchanged)`, ...costArgs, rightRows);
|
|
409
|
+
return mirroredBatchedNL.node;
|
|
410
|
+
}
|
|
411
|
+
log(`Selecting %s join (${COSTS}) for %d x %d rows`, bestAlgo, ...costArgs, leftRows, rightRows);
|
|
185
412
|
if (bestAlgo === 'merge') {
|
|
186
413
|
// Build merge join, inserting SortNodes if needed
|
|
187
414
|
let leftSource = node.left;
|
|
@@ -218,12 +445,7 @@ export function ruleJoinPhysicalSelection(node, context) {
|
|
|
218
445
|
// Swap: left becomes build, right becomes probe
|
|
219
446
|
probeSource = node.right;
|
|
220
447
|
buildSource = node.left;
|
|
221
|
-
|
|
222
|
-
equiPairs = extracted.equiPairs.map(p => ({
|
|
223
|
-
...p,
|
|
224
|
-
leftAttrId: p.rightAttrId,
|
|
225
|
-
rightAttrId: p.leftAttrId
|
|
226
|
-
}));
|
|
448
|
+
equiPairs = mirrorEquiPairs(extracted.equiPairs);
|
|
227
449
|
// INVARIANT: a physical join's advertised attribute order IS its emitted
|
|
228
450
|
// row layout. `emitBloomJoin` yields `[...leftRow, ...rightRow]` — that is,
|
|
229
451
|
// probe-then-build — and `getType()`, `combineJoinKeys` and
|