《SQL优化核心思想》---阅读笔记1
SQL优化核心思想一书主要以Oracle为例进行数据库优化的讲解。
sql优化一定要看自己使用的数据的版本
select * from v$version where rownum = 1; 查看数据库的版本
第一章 SQL优化必懂的概念
①基数 cardinality :这个基数指每一列的基数,比如:性别列,只有男女之分,那么该列的基数就为2
检查主键列与表中所有列是否有重复,可以采用如下的sql
select count(*) from test;
select count(distinct object_id) from test;
有一个大致模糊的概念界限(原因是考虑到下面的一个概念“回表”):
当查询的结果返回表中5%以内的数据时,应该走索引
当查询的结果超过表中5%以内的数据时,应该走全表扫描
②选择性 selectivity :基数与表中总行数的比值再乘以100%就是某个列的选择性。在进行sql优化的时候,单看列的基数是没有意义的,基数必须对比总行数才有实际意义,所以才引出了选择性这个概念
当表中数据足够大,某一列没有创建索引并且选择性大于20%可以考虑创建索引。
③回表 table access by index rowid:通过索引中记录的rowid访问表中的数据叫回表。回表一般是单块读,回表次数太多会影响sql性能,如果回表次数太多就不应该走索引了,应该直接走全表扫描
备注:oracle12C新功能批量回表在一定程度上改善了单行回表的性能
④集群因子 clustering factor
集群因子介于表的块数和行数之间
集群因子与块数接近说明表的数据基本上市有序的,回表只需要读取少量的数据块就能完成。反之与表记录接近,说明表的数据和索引顺序差异很大,在进行索引范围扫描或者索引全扫描的时候,回表会读取更多的数据块。
集群因子只会影响索引范围扫描(index range scan)和索引全表扫描(index full range),只有这两种方式会有大量的回表。
select owner,index_name,clustering_factor from dba_indexes where owner ='SCOTT' and index_name ='IDX_ID';
集群因子影响的是物理I/O 次数
本文地址:https://blog.csdn.net/LB_Captain/article/details/107300679