查询优化
一、查询与优化相关概念
1、一条查询sql分为这几个列:连接列(和join相关)、条件列(where子句后的列)、查询列(select的列)
一个好的执行计划分为这几个重点: 访问路径、连接方式、连接顺序
2、优化目标:最快响应时间
6、几个执行计划操作符
收集结果集:NSET
投影:PRJT
选择:SLCT
简单聚集:AAGR(用于没有group by的count sum age max min等聚集函数的计算;)
快速聚集:FAGR(用于没有过滤条件时从表或索引快速获取MAX/MIN/COUNT值;)
二次扫描:BLKUP(先使用2级别索引定位,再根据表的主键、聚集索引、rowid等信息定位数据行;说的很好,条件列的索引是用来定位的,然后通过rowid确定查询列的数据,当然如果查询列就是条件列那就不需要了)
全表扫描:CSCN(CSCN2是CLUSTER INDEX SCAN的缩写即通过聚集索引扫描全表,全表扫描是最简单的查询,如果没有选择谓词,或者没有索引可以利用,则系统一般只能做全表扫描。在一个高并发的系统中应尽量避免全表扫描)
现在明白了:
cscn(cluster index scan )是走聚集索引扫描,由于dm全表都是按照聚集索引排序的,所以走cscn就是走全表扫描。
nest loop就是连接方式的嵌套循环。那么出现这个就要注意嵌套循环的次数就是驱动表的行数,所以要找小表或者经过选择后行数比较少的表做驱动表。
一个是连接方式,一个是访问路径。
索引扫描sscn和索引查找ssek的区别:
假设没有建任何索引,则全表扫描,即使用聚簇索引扫描全表 select name from sysdba.test; 假设建了一个索引,这个时候有查询列,查询列就是建索引的列,但由于没有条件列,则无法进行选择,即无法进行查找,那么就要进行扫描了,由于又建了索引那么就走这个索引,那么就是索引扫描 create index index1 on sysdba.test(name); select name from sysdba.test; 假设建了索引,又因为有条件列,那么根据这个条件列做查找即可,即索引查找 create index index1 on sysdba.test(name); select * from sysdba.test where name = 'abc';
虽然都是通过索引取到相应数据,但是两者在过程上还是有区别的索引扫描几乎与表扫描没有区别,都是把索引从开始扫描到结束,而索引查找就不一样了,会根据你查询的字符,定位到索引的局部位置,然后再开始查找,不用把整个索引全部扫描一遍,在效率上比索引扫描快很多。
全表扫描cscn和全表查找csek的区别:
假设没有建聚簇索引列的话,那默认是rowid列,我们的条件列基本不可能使用rowid作为选择条件的,所以如果不建聚簇索引键,基本不可能走csek;这里我们给id字段建了聚簇主键
CREATE TABLE T_CSCN(ID INT CLUSTER PRIMARY KEY, NAME VARCHAR);
#第一个没有条件列第二个没有条件列没有建索引,所以都是cscn SELECT ID FROM SYSDBA.T_CSCN; SELECT * FROM SYSDBA.T_CSCN WHERE NAME LIKE 'A%';
#这个走聚簇索引列的查找,所以csek SELECT * FROM SYSDBA.T_CSCN WHERE ID =1;
CSCN2是CLUSTER INDEX SCAN的缩写即通过聚集索引扫描全表,全表扫描是最简单的查询,如果没有选择谓词(那么只能走索引扫描或全表扫描),或者没有索引可以利用(则走全表查找或全表扫描),则系统一般只能做全表扫描。在一个高并发的系统中应尽量避免全表扫描
聚簇索引键和主键的区别:
- 主键是唯一且非空的
- 聚簇索引键是表的默认排序键,即一个普通表的存储结构也是一个以此键排序的B+数,和以其他列为键的索引B+树一样的。当建表语句未指定聚集索引键,DM 的默认聚集索引键是 ROWID,即记录默认以 ROWID在页面中排序。