CSE 444: Database Internals
Section 5:
Query Optimizer
Plan for Today
1. Estimating Cost of a given plan
Student (sid, name, age, address)
Book(bid, title, author)
Checkout(sid, bid, date)
Query:
SELECT S.name
FROM Student S, Book B, Checkout C
WHERE S.sid = C.sid
AND B.bid = C.bid
AND B.author = 'Olden Fames'
AND S.age >= 13
AND S.age <= 19
Assumptions
S(sid,name,age,addr)
B(bid,title,author)
C(sid,bid,date)
Physical Query Plan – 1A
5
Student S
Checkout C
sid
(File scan)
(File scan)
(c) σ 13<=age<=19 Ʌ author = ‘Olden Fames’
Assumptions:
(a)
B(S)=1,000
B(B)=5,000
B(C)=15,000
T(S)=10,000
T(B)=50,000
T(C)=300,000
S(sid,name,age,addr)
B(bid,title,author)
C(sid,bid,date)
Book B
(File scan)
V(B,author) = 500
7 <= age <= 24
bid
(Tuple-based nested loop
B inner)
(b)
(d) Π name
(Block-nested loop,
S outer, C inner)
(On the fly)
(On the fly)
Solution – 1A
6
Student S
Checkout C
sid
(File scan)
(File scan)
(Block-nested loop,
S outer, C inner)
(c) σ 13<=age<=19 Ʌ author = ‘Olden Fames’
(a)
B(S)=1,000
B(B)=5,000
B(C)=15,000
T(S)=10,000
T(B)=50,000
T(C)=300,000
S(sid,name,age,addr)
B(bid,title,author)
C(sid,bid,date)
Book B
(File Scan)
V(B,author) = 500
7 <= age <= 24
(a)
Cost (I/O)
B(S) + B(S) * B(C)
= 1000 + 1000 * 15000
= 15,001,000
Cardinality
= T(S) * T(C)/V(S, sid)
= 300,000 (foreign key join)
(b)
Cost(I/O)
= T(S join C) * B(B)
= 300,000 * 5,000 = 15 * 108
Cardinality
= T(S join C) * T(B)/ V(B, bid))
= 300,000 (foreign key join)
(c, d)
Cost(I/O)
= 0 (on the fly)
Cardinality:
300,000 * 1/500 * 7/18
= 234 (approx)
(assuming uniformity and independence)
bid
(Tuple-based nested loop
B inner)
(b)
(d) Π name
(On the fly)
(On the fly)
Total cost = 1,515,001,000
Final cardinality = 234 (approx)
Physical Query Plan – 1B
7
Student S
Checkout C
bid
(Index scan)
(Index scan)
(f) σ 13<=age<=19
Assumptions:
B.author
(c)
B(S)=1,000
B(B)=5,000
B(C)=15,000
T(S)=10,000
T(B)=50,000
T(C)=300,000
S(sid,name,age,addr)
B(bid,title,author)
C(sid,bid,date)
Book B
(File scan)
V(B,author) = 500
7 <= age <= 24
sid
(Block nested loop
S inner)
(e)
(g) Π name
(Indexed-nested loop,
B outer, C inner)
(a) σ author = ‘Olden Fames’
(b) Π bid
(d) Π sid
(On the fly)
(On the fly)
(On the fly)
(On the fly)
Solution – 1B
8
Student S
Checkout C
bid
(Index scan)
(Index scan)
(f) σ 13<=age<=19
(c)
B(S)=1,000
B(B)=5,000
B(C)=15,000
T(S)=10,000
T(B)=50,000
T(C)=300,000
S(sid,name,age,addr)
B(bid,title,author): Un. B+ on author
C(sid,bid,date): Cl. B+ on bid
Book B
(File scan)
V(B,author) = 500
7 <= age <= 24
sid
(Block nested loop
S inner)
(e)
(g) Π name
(Indexed-nested loop,
B outer, C inner)
(a) σ author = ‘Olden Fames’
(b) Π bid
(d) Π sid
(On the fly)
(On the fly)
(On the fly)
(On the fly)
(a)
cost (I/O)
= T(B) / V(B, author)
= 50,000/500 = 100 (unclustered)
cardinality = 100
(b) Cost = 0
cardinality = 100
(c)
Cost = 100 * 2= 200
cardinality = 100 * 6 = 600
(d) Cost =0, cardinality= 600
(e) Outer relation is already in memory,
need to scan S relation
Cost B(S) = 1000
Cardinality = 600
(f) Cost = 0
Cardinality = 600 * 7/18 = 234 (approx)
(g) Cost= 0, cardinality = 234
Total cost = 1300 (compare with 1,515,001,000 in 1A)
Final cardinality = 234 (approx) (same as 1A!)
2. Selinger Optimization Example
Sailors (sid, sname, srating, age)
Boats(bid, bname, color)
Reserves(sid, bid, date, rname)
Query:
SELECT S.sid, R.rname
FROM Sailors S, Boats B, Reserves R
WHERE S.sid = R.sid
AND B.bid = R.bid
AND B.color = red
Example is from the Ramakrishnan book
Available Indexes
S (sid, sname, srating, age)
B (bid, bname, color)
R (sid, bid, date, rname)
First Pass
S (sid, sname, srating, age): 1. B+tree - sid, 2. hash index - sid
B (bid, bname, color) : 1. B+tree - color, 2. hash index - color
R (sid, bid, date, rname) : 1. B+tree - sid, 2. Clustered B+tree - bid
SELECT S.sid, R.rname
WHERE S.sid = R.sid
B.bid = R.bid, B.color = red
Second Pass
S (sid, sname, srating, age): 1. B+tree - sid, 2. hash index - sid
B (bid, bname, color) : 1. B+tree - color, 2. hash index - color
R (sid, bid, date, rname) : 1. B+tree - sid, 2. Clustered B+tree - bid
SELECT S.sid, R.rname
WHERE S.sid = R.sid
B.bid = R.bid, B.color = red
Outer | Inner | OPTION 1 | OPTION 2 | OPTION 3 |
R (file scan) | B | (B+-color) | (hash color) | (File scan) |
R (file scan) | S | (B+-sid) | (hash sid) | ,, |
S (file scan) | B | (B+-color) | (hash color) | ,, |
S (file scan) | R | (B+-sid) | (Cl. B+ bid) | ,, |
B (hash index) | R | (B+-sid) | (Cl. B+ bid | ,, |
B (hash index) | S | (B+-sid) | (hash sid) | ,, |
Second Pass
S (sid, sname, srating, age): 1. B+tree - sid, 2. hash index - sid
B (bid, bname, color) : 1. B+tree - color, 2. hash index - color
R (sid, bid, date, rname) : 1. B+tree - sid, 2. Clustered B+tree - bid
SELECT S.sid, R.rname
WHERE S.sid = R.sid
B.bid = R.bid, B.color = red
Outer | Inner | OPTION 1 | OPTION 2 | OPTION 3 |
R (file scan) | B | (B+-color) | (hash color) | (File scan) |
R (file scan) | S | (B+-sid) | (hash sid) | ,, |
S (file scan) | B | (B+-color) | (hash color) | ,, |
S (file scan) | R | (B+-sid) | (Cl. B+ bid) | ,, |
B (hash index) | S | (B+-sid) | (hash sid) | ,, |
B (hash index) | R | (B+-sid) | (Cl. B+ bid): | ,, |
OPTION 3 is not shown on next slide, expected to be more expensive
S (sid, sname, srating, age): 1. B+tree - sid, 2. hash index - sid
B (bid, bname, color) : 1. B+tree - color, 2. hash index - color
R (sid, bid, date, rname) : 1. B+tree - sid, 2. Clustered B+tree - bid
SELECT S.sid, R.rname
WHERE S.sid = R.sid
B.bid = R.bid, B.color = red
Outer | Inner | OPTION 1 | OPTION 2 |
R (file scan) | S | (B+-sid) Slower than hash-index (need Sailor tuples matching S.sid = value, where value comes from an outer R tuple) | (hash sid): likely to be faster 2A. Index nested loop join 2B Sort Merge based join: (sorted by sid) |
R (file scan) | B | (B+-color) Not useful | (hash color) Select those tuples where B.color = red using the color index (note: no index on bid) |
S (file scan) | R | (B+-sid) Consider all join methods | (Cl. B+ bid) Not useful |
B (hash index) | R | (B+-sid) Not useful | (Cl. B+ bid) 2A. Index nested loop join 2B. Sort-merge join (sorted on bid) |
Keep the least cost plan between
Third Pass
S (sid, sname, srating, age): 1. B+tree - sid, 2. hash index - sid
B (bid, bname, color) : 1. B+tree - color, 2. hash index - color
R (sid, bid, date, rname) : 1. B+tree - sid, 2. Clustered B+tree - bid
SELECT S.sid, R.rname
WHERE S.sid = R.sid
B.bid = R.bid, B.color = red
Homework 3