?
optimizer is the core of a DB engine!
?
实际运行计划(physical plan) = 访问方式 ( access method) + join算法 + 执行顺序
?
1.access method
1) index scan
2) file scan
?
2.join algorithm
1) nested-loop
2) hash
3) sort-merge
?
3.执行顺序
一个复杂query由一些简单的query(single block)嵌套而成,
如:
select a from T1 where T1.b>(select T2.b from T2 where T2.b=1)
可以被分解为两个简单query:
1)select a from T1 where T1.b>()
2)select T2.b from T2 where T2.b=1
对于每个query,根据一些相等公式,如
产生不同的执行顺序。
?
一个query如:select * from A,B,C
有多少种计划:
access method:2^3=8
join:3^2=9
order:3!=6
总共:8*9*6=432
这样,一个query有不同的执行计划,如何选择最好的呢?
常见方法:
?
1.costed-base
计算(估算)计划中每一步的IO cost, 输出的tuple数。
?
2. rule-base
根据一些经验,query的特点,执行特定的顺序。如: if sql1 是 A型, 使用 plan1
?
3.random
从众多plan中随机选择,估算其cost。
?
(oracle数据库的RBO和CBO就是指 rule-based optimization 和 cost-based optimization.)
?