sql优化之物理优化

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

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

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

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

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

明日继续更~~~~~

    原文作者:蒙奇D颖
    原文地址: https://segmentfault.com/a/1190000017365287
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞