Skip to content

Commit

Permalink
opt: add exploration rule for constraining scans
Browse files Browse the repository at this point in the history
New "constrain scan" explore rule tries to push filters into scans,
as constraints. The result is either just the constrained scan (if the
filter was fully converted into a constraint), or a select on top of
the constrained scan.

Along with the rule, we needed some minor changes on the execution
side to support scan constraints.

Other fixes that were necessary:

 - optgen: the generated code for explore rules was adding expressions
   to the wrong group (because of shadowing of the original `_eid`).

 - idxconstraint support for `FiltersOp`.

 - move the idxconstraint test to `idxconstraint_test` package to avoid
   import loop.

 - test catalog fix: the primary index was returning the wrong ordinal
   value.

 - adding some cost to the select operator, to prefer a constrained
   scan with no remaining filter (vs a constrained scan with a
   remaining filter).

Release note: None
  • Loading branch information
RaduBerinde committed Mar 30, 2018
1 parent be3e74e commit e88949a
Show file tree
Hide file tree
Showing 39 changed files with 850 additions and 517 deletions.
2 changes: 1 addition & 1 deletion pkg/sql/opt/exec/execbuilder/relational_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ func (b *Builder) buildScan(ev memo.ExprView) (execPlan, error) {
n++
}
}
root, err := b.factory.ConstructScan(tab, tab.Index(def.Index), needed)
root, err := b.factory.ConstructScan(tab, tab.Index(def.Index), needed, def.Constraint)
if err != nil {
return execPlan{}, err
}
Expand Down
120 changes: 52 additions & 68 deletions pkg/sql/opt/exec/execbuilder/testdata/aggregate
Original file line number Diff line number Diff line change
Expand Up @@ -798,13 +798,11 @@ column4:int
exec-explain
SELECT MIN(x) FROM xyz WHERE x in (0, 4, 7)
----
group 0 group · · (column4) ·
│ 0 · aggregate 0 min(x) · ·
└── filter 1 filter · · (x) ·
│ 1 · filter x IN (0, 4, 7) · ·
└── scan 2 scan · · (x) ·
· 2 · table xyz@primary · ·
· 2 · spans ALL · ·
group 0 group · · (column4) ·
│ 0 · aggregate 0 min(x) · ·
└── scan 1 scan · · (x) ·
· 1 · table xyz@primary · ·
· 1 · spans /0-/0/# /4-/4/# /7-/7/# · ·

exec
SELECT MAX(x) FROM xyz
Expand All @@ -831,15 +829,13 @@ column4:int
exec-explain
SELECT MIN(y) FROM xyz WHERE x = 1
----
group 0 group · · (column4) ·
│ 0 · aggregate 0 min(xyz.y) · ·
└── render 1 render · · ("xyz.y") ·
│ 1 · render 0 y · ·
└── filter 2 filter · · (x, y) ·
│ 2 · filter x = 1 · ·
└── scan 3 scan · · (x, y) ·
· 3 · table xyz@primary · ·
· 3 · spans ALL · ·
group 0 group · · (column4) ·
│ 0 · aggregate 0 min(xyz.y) · ·
└── render 1 render · · ("xyz.y") ·
│ 1 · render 0 y · ·
└── scan 2 scan · · (x, y) ·
· 2 · table xyz@primary · ·
· 2 · spans /1-/1/# · ·

exec
SELECT MAX(y) FROM xyz WHERE x = 1
Expand All @@ -850,15 +846,13 @@ column4:int
exec-explain
SELECT MAX(y) FROM xyz WHERE x = 1
----
group 0 group · · (column4) ·
│ 0 · aggregate 0 max(xyz.y) · ·
└── render 1 render · · ("xyz.y") ·
│ 1 · render 0 y · ·
└── filter 2 filter · · (x, y) ·
│ 2 · filter x = 1 · ·
└── scan 3 scan · · (x, y) ·
· 3 · table xyz@primary · ·
· 3 · spans ALL · ·
group 0 group · · (column4) ·
│ 0 · aggregate 0 max(xyz.y) · ·
└── render 1 render · · ("xyz.y") ·
│ 1 · render 0 y · ·
└── scan 2 scan · · (x, y) ·
· 2 · table xyz@primary · ·
· 2 · spans /1-/1/# · ·

exec
SELECT MIN(y) FROM xyz WHERE x = 7
Expand All @@ -869,15 +863,13 @@ NULL
exec-explain
SELECT MIN(y) FROM xyz WHERE x = 7
----
group 0 group · · (column4) ·
│ 0 · aggregate 0 min(xyz.y) · ·
└── render 1 render · · ("xyz.y") ·
│ 1 · render 0 y · ·
└── filter 2 filter · · (x, y) ·
│ 2 · filter x = 7 · ·
└── scan 3 scan · · (x, y) ·
· 3 · table xyz@primary · ·
· 3 · spans ALL · ·
group 0 group · · (column4) ·
│ 0 · aggregate 0 min(xyz.y) · ·
└── render 1 render · · ("xyz.y") ·
│ 1 · render 0 y · ·
└── scan 2 scan · · (x, y) ·
· 2 · table xyz@primary · ·
· 2 · spans /7-/7/# · ·

exec
SELECT MAX(y) FROM xyz WHERE x = 7
Expand All @@ -888,15 +880,13 @@ NULL
exec-explain
SELECT MAX(y) FROM xyz WHERE x = 7
----
group 0 group · · (column4) ·
│ 0 · aggregate 0 max(xyz.y) · ·
└── render 1 render · · ("xyz.y") ·
│ 1 · render 0 y · ·
└── filter 2 filter · · (x, y) ·
│ 2 · filter x = 7 · ·
└── scan 3 scan · · (x, y) ·
· 3 · table xyz@primary · ·
· 3 · spans ALL · ·
group 0 group · · (column4) ·
│ 0 · aggregate 0 max(xyz.y) · ·
└── render 1 render · · ("xyz.y") ·
│ 1 · render 0 y · ·
└── scan 2 scan · · (x, y) ·
· 2 · table xyz@primary · ·
· 2 · spans /7-/7/# · ·

exec
SELECT MIN(x) FROM xyz WHERE (y, z) = (2, 3.0)
Expand All @@ -907,15 +897,13 @@ column4:int
exec-explain
SELECT MIN(x) FROM xyz WHERE (y, z) = (2, 3.0)
----
group 0 group · · (column4) ·
│ 0 · aggregate 0 min(xyz.x) · ·
└── render 1 render · · ("xyz.x") ·
│ 1 · render 0 x · ·
└── filter 2 filter · · (x, y, z) ·
│ 2 · filter (y = 2) AND (z = 3.0) · ·
└── scan 3 scan · · (x, y, z) ·
· 3 · table xyz@primary · ·
· 3 · spans ALL · ·
group 0 group · · (column4) ·
│ 0 · aggregate 0 min(xyz.x) · ·
└── render 1 render · · ("xyz.x") ·
│ 1 · render 0 x · ·
└── scan 2 scan · · (x, y, z) ·
· 2 · table xyz@zyx · ·
· 2 · spans /3/2-/3/3 · ·

exec
SELECT MAX(x) FROM xyz WHERE (z, y) = (3.0, 2)
Expand All @@ -926,15 +914,13 @@ column4:int
exec-explain
SELECT MAX(x) FROM xyz WHERE (z, y) = (3.0, 2)
----
group 0 group · · (column4) ·
│ 0 · aggregate 0 max(xyz.x) · ·
└── render 1 render · · ("xyz.x") ·
│ 1 · render 0 x · ·
└── filter 2 filter · · (x, y, z) ·
│ 2 · filter (z = 3.0) AND (y = 2) · ·
└── scan 3 scan · · (x, y, z) ·
· 3 · table xyz@primary · ·
· 3 · spans ALL · ·
group 0 group · · (column4) ·
│ 0 · aggregate 0 max(xyz.x) · ·
└── render 1 render · · ("xyz.x") ·
│ 1 · render 0 x · ·
└── scan 2 scan · · (x, y, z) ·
· 2 · table xyz@zyx · ·
· 2 · spans /3/2-/3/3 · ·

# VARIANCE/STDDEV

Expand All @@ -959,13 +945,11 @@ NULL
exec-explain
SELECT VARIANCE(x) FROM xyz WHERE x = 1
----
group 0 group · · (column4) ·
│ 0 · aggregate 0 variance(x) · ·
└── filter 1 filter · · (x) ·
│ 1 · filter x = 1 · ·
└── scan 2 scan · · (x) ·
· 2 · table xyz@primary · ·
· 2 · spans ALL · ·
group 0 group · · (column4) ·
│ 0 · aggregate 0 variance(x) · ·
└── scan 1 scan · · (x) ·
· 1 · table xyz@primary · ·
· 1 · spans /1-/1/# · ·

exec
SELECT STDDEV(x), STDDEV(y::decimal), round(STDDEV(z), 14) FROM xyz
Expand Down
116 changes: 51 additions & 65 deletions pkg/sql/opt/exec/execbuilder/testdata/orderby
Original file line number Diff line number Diff line change
Expand Up @@ -704,41 +704,37 @@ a:int
exec-explain
SELECT c FROM abc WHERE b = 2 ORDER BY c
----
sort 0 sort · · (c) +c
│ 0 · order +c · ·
└── render 1 render · · (c) ·
│ 1 · render 0 c · ·
└── filter 2 filter · · (b, c) ·
│ 2 · filter b = 2 · ·
└── scan 3 scan · · (b, c) ·
· 3 · table abc@primary · ·
· 3 · spans ALL · ·
sort 0 sort · · (c) +c
│ 0 · order +c · ·
└── render 1 render · · (c) ·
│ 1 · render 0 c · ·
└── scan 2 scan · · (b, c) ·
· 2 · table abc@bc · ·
· 2 · spans /2-/3 · ·

exec-explain
SELECT c FROM abc WHERE b = 2 ORDER BY c DESC
----
sort 0 sort · · (c) -c
│ 0 · order -c · ·
└── render 1 render · · (c) ·
│ 1 · render 0 c · ·
└── filter 2 filter · · (b, c) ·
│ 2 · filter b = 2 · ·
└── scan 3 scan · · (b, c) ·
· 3 · table abc@primary · ·
· 3 · spans ALL · ·
sort 0 sort · · (c) -c
│ 0 · order -c · ·
└── render 1 render · · (c) ·
│ 1 · render 0 c · ·
└── scan 2 scan · · (b, c) ·
· 2 · table abc@bc · ·
· 2 · spans /2-/3 · ·

# Verify that the ordering of the primary index is still used for the outer sort.
exec-explain
SELECT * FROM (SELECT b, c FROM abc WHERE a=1 ORDER BY a,b) ORDER BY b,c
----
render 0 render · · (b, c) ·
│ 0 · render 0 b · ·
│ 0 · render 1 c · ·
└── filter 1 filter · · (a, b, c) ·
│ 1 · filter a = 1 · ·
└── scan 2 scan · · (a, b, c) ·
· 2 · table abc@bc · ·
· 2 · spans ALL · ·
render 0 render · · (b, c) ·
│ 0 · render 0 b · ·
│ 0 · render 1 c · ·
└── sort 1 sort · · (a, b, c) +b,+c
│ 1 · order +b,+c · ·
└── scan 2 scan · · (a, b, c) ·
· 2 · table abc@primary · ·
· 2 · spans /1-/2 · ·

exec-raw
CREATE TABLE bar (
Expand Down Expand Up @@ -812,46 +808,38 @@ column5:int
exec-explain
SELECT a, b, c FROM abcd@abc WHERE (a, b) = (1, 4) ORDER BY c
----
sort 0 sort · · (a, b, c) +c
│ 0 · order +c · ·
└── filter 1 filter · · (a, b, c) ·
│ 1 · filter (a = 1) AND (b = 4) · ·
└── scan 2 scan · · (a, b, c) ·
· 2 · table abcd@primary · ·
· 2 · spans ALL · ·
sort 0 sort · · (a, b, c) +c
│ 0 · order +c · ·
└── scan 1 scan · · (a, b, c) ·
· 1 · table abcd@abc · ·
· 1 · spans /1/4-/1/5 · ·

exec-explain
SELECT a, b, c FROM abcd@abc WHERE (a, b) = (1, 4) ORDER BY c, b, a
----
sort 0 sort · · (a, b, c) +c,+b,+a
│ 0 · order +c,+b,+a · ·
└── filter 1 filter · · (a, b, c) ·
│ 1 · filter (a = 1) AND (b = 4) · ·
└── scan 2 scan · · (a, b, c) ·
· 2 · table abcd@primary · ·
· 2 · spans ALL · ·
sort 0 sort · · (a, b, c) +c,+b,+a
│ 0 · order +c,+b,+a · ·
└── scan 1 scan · · (a, b, c) ·
· 1 · table abcd@abc · ·
· 1 · spans /1/4-/1/5 · ·

exec-explain
SELECT a, b, c FROM abcd@abc WHERE (a, b) = (1, 4) ORDER BY b, a, c
----
sort 0 sort · · (a, b, c) +b,+a,+c
│ 0 · order +b,+a,+c · ·
└── filter 1 filter · · (a, b, c) ·
│ 1 · filter (a = 1) AND (b = 4) · ·
└── scan 2 scan · · (a, b, c) ·
· 2 · table abcd@primary · ·
· 2 · spans ALL · ·
sort 0 sort · · (a, b, c) +b,+a,+c
│ 0 · order +b,+a,+c · ·
└── scan 1 scan · · (a, b, c) ·
· 1 · table abcd@abc · ·
· 1 · spans /1/4-/1/5 · ·

exec-explain
SELECT a, b, c FROM abcd@abc WHERE (a, b) = (1, 4) ORDER BY b, c, a
----
sort 0 sort · · (a, b, c) +b,+c,+a
│ 0 · order +b,+c,+a · ·
└── filter 1 filter · · (a, b, c) ·
│ 1 · filter (a = 1) AND (b = 4) · ·
└── scan 2 scan · · (a, b, c) ·
· 2 · table abcd@primary · ·
· 2 · spans ALL · ·
sort 0 sort · · (a, b, c) +b,+c,+a
│ 0 · order +b,+c,+a · ·
└── scan 1 scan · · (a, b, c) ·
· 1 · table abcd@abc · ·
· 1 · spans /1/4-/1/5 · ·

exec-raw
CREATE TABLE nan (id INT PRIMARY KEY, x REAL)
Expand Down Expand Up @@ -974,17 +962,15 @@ CREATE TABLE uvwxyz (
exec-explain
SELECT * FROM (SELECT y, w, x FROM uvwxyz WHERE y = 1 ORDER BY w) ORDER BY w, x
----
render 0 render · · (y, w, x) ·
│ 0 · render 0 y · ·
│ 0 · render 1 w · ·
│ 0 · render 2 x · ·
└── sort 1 sort · · (w, x, y) +w,+x
│ 1 · order +w,+x · ·
└── filter 2 filter · · (w, x, y) ·
│ 2 · filter y = 1 · ·
└── scan 3 scan · · (w, x, y) ·
· 3 · table uvwxyz@primary · ·
· 3 · spans ALL · ·
render 0 render · · (y, w, x) ·
│ 0 · render 0 y · ·
│ 0 · render 1 w · ·
│ 0 · render 2 x · ·
└── sort 1 sort · · (w, x, y) +w,+x
│ 1 · order +w,+x · ·
└── scan 2 scan · · (w, x, y) ·
· 2 · table uvwxyz@ywxz · ·
· 2 · spans /1-/2 · ·

exec-raw
CREATE TABLE blocks (
Expand Down
Loading

0 comments on commit e88949a

Please sign in to comment.