sql优化之物理优化

在单机数据库系统中进行优化。面临的问题,好比说给定一个要query的sql语句,查询优化算法的目标就是找到查询的一个具备最小执行花费的执行计划,若是找到了,那么这样的执行计划必定具备最快的响应时间。

查询语句可表示成一颗二叉树,其中叶子表明关系,内部结点是运算符,表示左右子树的链接关系,子树是sql片断或子表达式。根节点是最后运算的操做符。根节点运算以后,获得的是sql查询优化后的结果。这样一棵树就是查询路径。多个关系链接,链接顺序不一样,能够得出多个相似的二叉树。
查询优化就是找出代价最小的二叉树,即最优的查询路径。
每条路径的生成,包括单表扫描,两表链接,多表链接顺序,多表链接搜索空间等技术。算法

查询代价估算基于cpu代价和IO代价,因此代价模型能够用如下计算公式表示: 总代价 = IO代价 + CPU代价; cost = 计划运行时访问的页面数*每一个页面读取的时间花费 + 权重因子*访问元组数; 权重因子,代表IO到CPU的相关性。访问元组数,它反映了CPU花费,存储层是以页面为单位,数据以页面的形式被读进内存,每一个页面上可能有多条元组,访问元组须要解析元组结构,才能把元组上的字段读出,这消耗的是CPU。若是是索引扫描,则还会包括索引读取的花费。

思路二:物理优化,解决的问题有(一、从可选的单表扫描方式中,挑选什么样的单表扫描方式是最优的?二、对于两个表链接时,如何链接是最优的?三、对于多个表链接,链接顺序有多种组合,哪一种链接顺序时最优的?对于多个表链接,链接顺序有多种组合,是否要对每种组合都探索?若是不所有探索,怎么找到最优的一种组合?)

  • 单表扫描算法(它分别有全表扫描表数据,还有局部扫描表数据。单表扫描须要从表上获取元组,直接关联到物理IO的读取)
    单表扫描须要把数据从存储系统上调入内存,因此单表扫描须要考虑IO花费。
    顺序扫描 = 一个页面的IO花费*数据页面数量 + 一个元组从页面中解析的cpu花费*元组数;
    索引及其余方式扫描 = 一个页面的IO花费*索引页面数量 + 一个元组从页面中解析的cpu花费*索引做用下的可用元组数元组数*权重因子);
    一、索引
    索引是什么?
    答:索引是创建在表上,本质上是经过索引直接定位表的物理元组,加快数据获取的方式,因此索引优化就归属到物理查询优化阶段。
    使用索引的原则是什么?
    答:索引列做为条件出如今where,having,on子句中,或者主键,须要在某元素上Max min以及排序,比较符为>,<,between and的列,这样有利于利用索引过滤元组。而若是用不等于<>不能够作索引扫描。
    注意事项?
    答:索引列出如今目标列,一般不可以使用索引。(使用min,max目标列除外),不是你规定了某个列为索引后,就必定会索引扫描,索引扫描须要知足使用条件。扫描方式的选取取决于代价估算模型对每种扫描试的评估。

  • 两表链接算法

  • 多表链接算法

明日继续更~~~~~sql

相关文章
相关标签/搜索