sql statement 执行分为四步:
存储结构: tuple ->page->segment 我们通过scan访问tuple
一种是segment scan,访问所有segnment上的tuple去找满足条件的tuple,所有tuple都会被访问一次
第二种是index scan,通过索引访问tuple,有可能造成重复访问,采用clustered index会好一点
由于是对访问路径进行最优解选择,需要提供cost模型,考虑disk io和cpu utilization
可用如下公式表示:
cost = page feteches + w * rsi calls 如何利用此公式对 single query 进行量化呢,首先考虑page fetch:
一个single query block由select from where构成,问题的核心在于由where导致的条件所要搜索的tuple数目
我们在catalog中进行基本的数据统计,并同时得到一个selectivity factor,表示相关谓词中满足条件的tuple的占比
最终得到俩个结果:
QCARD: query cardinality 每一个query中from relation list的 cardinality乘以where中query factor的selectivity factor
RSICARD: relation cardinality 乘以 sarg 的selectivity factor
假设query中有ordered by 或者 group by 时,有nteresting order的概念,此时我们需要将最便宜的interesting order和unordered find加上sorting进行比较
对于single relation access, cost公式具体表示为index page fetch + data page fetch + W * RSI retrieval calls
此处需要考虑buffer的影响
我们要首先决定join的执行过程,再将其衍生到n-way join, 再根据join的执行过程计算cost模型,进行选择
join的方法有俩种,第一种: nested-loop join: 分为outer join 和 inner join.采用类似于俩个for loop的方式执行,且对顺序没有要求
第二种叫做merging scan:
该方法要求outer 和 inner relation按照join column order进行scan,
同时我们还可以利用join column 的ordering避免rescanning inner
对于n-way join,我们可以将其看做一系列的2-way join。
接下来考虑join order 的问题:
对于from list中n个 relation,会有n!个join顺序,前k 后 n-k 具有独立性
我们只选择由join predicate的,连接inner join 和正在参与的join. 即先选择有join relation的join,后选择没有的join。
如何计算join 的costs 此处注意的点:
理解原论文中的树和merge join中 sort的作用,另一种选择
从内到外开始展开