Download - Query Rewrite

Transcript
Page 1: Query Rewrite

Query Rewrite

Starburst Model (IBM)

Page 2: Query Rewrite

DB2 Query Optimizer (Starburst)

Parsing and Semantic Checking

Query Rewrite

Plan Optimization

Query Evaluation System

Query GraphModel

ExecutablePlan

Data Flow

Control Flow

Compile Time

Run Time

Page 3: Query Rewrite

Goal of Query Rewrite

•Make queries as declarative as possible:

Poorly expressed queries could force the optimizer into choosing suboptimal plans

•Perform natural heuristics

For example, “predicate pushdown”

Page 4: Query Rewrite

Components of Rewrite Engine

• Rewrite rules (more later)• Rule engine

– control strategies• sequential (rules are processed sequentially)• priority (higher priority rules are given a chance first)• statistical (next rule is chosen randomly based on a user

defined probability distribution– budget

• to avoid spending too much time on rewrites, the processing stops at a consistent state of QGM when the budget is exhausted

• Search facility– browses through QGM providing the context for the

rules to work on

Page 5: Query Rewrite

Problem

• How do we choose between competing incompatible transformations?

• Optimal solution: apply cost analysis and pick the transformation leading to a cheaper plan

• Practical solution (why?): generate multiple alternatives and send them to plan optimization phase (problems?)

Page 6: Query Rewrite

Rewrite Rules: SELECT MergeCREATE VIEW itpv AS

(SELECT DISTINCT itp.itemn, pur.vendn

FROM itp, pur

WHERE itp.ponum = pur.ponum AND

pur.odate > ’85’)

SELECT DISTINCT itm.itmn, pur.vendn

FROM itm, itp, pur

WHERE itp.ponum = pur.ponum AND itm.itemn = itpv.itemn AND

pur.odate > ’85’ AND

itm.itemn > ’01’ AND

itm.itemn < ’20’

SELECT itm.itmn, itpv.vendn

FROM itm, itpv

WHERE itm.itemn = itpv.itemn AND

itm.itemn > ’01’ AND

itm.itemn < ’20’

Speedup: 200 times

Page 7: Query Rewrite

Rewrite Rules: Existential Subquery Merge

SELECT *

FROM itp

WHERE itm.itemn IN

( SELECT itl.itmn

FROM itl

WHERE itl.wkcen = ‘WK468’ AND

itl.locan = ‘L’)

SELECT DISTINCT itp.*

FROM itp, itl

WHERE itp.itmn = itl.itemn AND

itl.wkcen = ‘WK468’ AND

itl.locan = ‘L’

Speedup: 15 times

Page 8: Query Rewrite

Rewrite Rules:Intersect to Exists

SELECT itemn

FROM wor

WHERE empno = ‘EMPN1279’

INTERSECT

SELECT itmn

FROM itl

WHERE entry_time = ‘9773’ AND

wkctr = ‘WK195’)

Speedup: 8 times

SELECT DISTINCT itemn

FROM wor, itl

WHERE empno = ‘EMPN1279’

entry_time = ‘9773’ AND

wkctr = ‘WK195’) AND

itl.itmn = wor.itemn

Page 9: Query Rewrite

The Count Bug

parts(PNUM,QOH)supply(PNUM,QUAN,SHIPDATE)

Query: Find the part numbers of those parts whose quantities on hand equal the number of shipments of those parts before 1-1-80.

select PNUMfrom partswhere QOH = ( select count(SHIPDATE)

from supplywhere supply.PNUM = parts.PNUM

and SHIPDATE < 1-1-80)

Page 10: Query Rewrite

The Count Bug (cont.)select PNUMfrom partswhere QOH = ( select count(SHIPDATE)

from supplywhere supply.PNUM = parts.PNUM

and SHIPDATE < 1-1-80)

temp (SUPPNUM,CT) =(select PNUM, count(SHIPDATE)from supplywhere SHIPDATE < 1-1-80) group by PNUM)

select PNUMfrom parts, tempwhere parts.QOH = temp.CT and

temp.PNUM = parts.PNUM

Page 11: Query Rewrite

The Count Bug (cont.)

PNUM QOH

3 6

10 1

8 0

PNUM QUAN SHIPDATE

3 4 7-3-79

3 2 10-1-78

10 1 6-8-78

10 2 8-10-81

8 5 5-7-83

select PNUMfrom partswhere QOH = ( select count(SHIPDATE)

from supplywhere supply.PNUM = parts.PNUM

and SHIPDATE < 1-1-80)

SupplyParts

PNUM

10

8

Result

Page 12: Query Rewrite

The Count Bug (cont.)

PNUM QOH

3 6

10 1

8 0

PNUM QUAN SHIPDATE

3 4 7-3-79

3 2 10-1-78

10 1 6-8-78

10 2 8-10-81

8 5 5-7-83

SupplyParts

Temptemp (SUPPNUM,CT) =

(select PNUM, count(SHIPDATE)from supplywhere SHIPDATE < 1-1-80) group by PNUM)

Suppnum CT

3 2

10 1

Page 13: Query Rewrite

The Count Bug (cont.)

PNUM QOH

3 6

10 1

8 0

Parts Temp

SUPPNUM CT

3 2

10 1

select PNUMfrom parts, tempwhere parts.QOH = temp.CT and

temp.PNUM = parts.PNUM

Result

PNUM

10

Page 14: Query Rewrite

The Count Bug – solutionwith outer joins

X

A

B

Y

B

C

E

R S R=+S X Y

A null

B B

null C

E Null

Page 15: Query Rewrite

The Count Bug – solutionwith outer joins

temp (SUPPNUM,CT) =(select parts.PNUM, count(SHIPDATE)from parts, supplywhere SHIPDATE < 1-1-80 and

parts.PNUM =+ supply.PNUMgroup by parts.PNUM)

Parts.PNUM Parts.QOH Supply.PNUM Supply.QUON Supply.SHIPDATE

3 6 3 4 7-3-79

3 6 3 2 10-1-78

10 1 10 1 6-8-78

8 0 null null null

parts.PNUM =+ supply.PNUM (for SHIPDATE < 1-1-80)