美文网首页
读《数据库索引设计与优化》以及相关知识 - 草稿

读《数据库索引设计与优化》以及相关知识 - 草稿

作者: 吉祥如意酥 | 来源:发表于2018-07-12 22:10 被阅读0次

    相关知识摘录

    1. sql语句的执行顺序: from--where--group by--having--select--order by

    from 子句--执行顺序为从后往前、从右到左

    表名(最后面的那个表名为驱动表,执行顺序为从后往前, 所以数据量较少的表尽量放后)

    oracle 的解析器按照从右到左的顺序处理,FROM 子句中的表名,FROM 子句中写在最后的表(基础表 driving table)将被最先处理,即最后的表为驱动表,在FROM 子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3 个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指被其他表所引用的表。

    where子句--执行顺序为自下而上、从右到左

    ORACLE 采用自下而上从右到左的顺序解析Where 子句,根据这个原理,表之间的连接必须写在其他Where 条件之前, 可以过滤掉最大数量记录的条件必须写在Where 子句的末尾。

    group by--执行顺序从左往右分组

    提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。即在GROUP BY前使用WHERE来过虑,而尽量避免GROUP BY后再HAVING过滤。

    having 子句----很耗资源,尽量少用

    select子句--少用*号,尽量取字段名称。

    ORACLE 在解析的过程中, 会将依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 使用列名意味着将减少消耗时间。

    sql 语句用大写的;因为 oracle 总是先解析 sql 语句,把小写的字母转换成大写的再执行。

    order by子句--执行顺序为从左到右排序,很耗资源

    2. Oracle 执行计划分析

    1)Sql Developer得到执行计划

    方法一: 快捷键F6

    方法二: set autotrace on

    2) 扫描方式

    全表扫描 Full Table Scans : 直接对表数据进行查询

    索引扫描 Index scan:

    2.1) 唯一索引扫描 Index unique scan:以主键作为索引的情况下,将主键作为谓词查询,返回单个rowid的数据内容

    2.2)索引范围扫描 Index range scan:

    * 在唯一索引上使用range操作符(>,<,<>,>=,<=,between)

    * 在组合索引上,只使用部分列进行查询

    * 对非唯一索引上的列进行查询

    2.3)索引全扫描 Index full scan: 需要查询的数据从索引中可以全部得到

    2.4) 索引快速扫描 Index fast full scan:和Index full scan类似但是不对结果进行排序

    3. 统计信息

    统计信息主要是描述数据库中表,索引的大小,规模,数据分部情况的一系列信息。根据这些信息,进行数据库查询的规划,决定走不走索引,走哪条索引。11g系统默认是周一到周五晚上十点到两点,周六早上六点持续二十小时。当更新数据大于一个阈值的时候进行重新计算(默认好像是10%)执行计划的推算就是根据统计信息得到的。

    书中内容整理

    1. 三星索引

    三星索引可以作为设计索引的原则之一。首先何谓三星索引

    第一颗星:尽量保证宽度最小,取出所有等值谓词的列作为索引开头的列,这样必须扫描的索引片宽度就会大大减少。

    第二颗星:将Order by的列加到索引中(追加在等值索引后面)这样得到的索引片段无需排序就已经是正确的顺序。

    第三颗星:将查询语句中剩余的列加到索引中去,这样就只需要查询索引而不需要访问表。

    (有的时候不能同时满足三颗星,比如有between谓词,如果放在order by前面可以保证宽度最小,但是索引顺序就不是order by的顺序了,一般来说1,2星之间先考虑满足第一颗星)

    2. 多余的索引

    首先,每次创建索引都要回看已有的索引,然后评估原来的索引是否是多余的。多余的索引分为三类:

    完全多余的索引:比如等值索引的顺序不同等情况。

    近乎多余的索引:索引1(A,B,C),索引2(A,B,C,D,E),索引2比索引1并不会有明显的处理速度变化,所以1就变得近乎多余了。

    可能多余的索引:新的索引(A,B,C,D,E,F),表上已存在的索引(A,B,F,C),考虑如果把已存在的索引替换成(A,B,F,C,D,E),是否还需要新的索引。考虑两点:新的索引是否是查询有更多的匹配列,是否可以避免排序。

    3. 增加一个索引的代价

    使表的插入,更新和删除操作变慢。合理假设插入一条记录需要10ms,当向一张具有十个索引的表中增加十条记录的时候就会有将近1s的开销,看起来是不大容易接受的。从磁盘负载的角度来说也不容许表上有太多索引。所以是否增加索引要考虑更新和search的频率。

    相关文章

      网友评论

          本文标题:读《数据库索引设计与优化》以及相关知识 - 草稿

          本文链接:https://www.haomeiwen.com/subject/jpkdpftx.html