查询优化


 

一、查询与优化相关概念

1、一条查询sql分为这几个列:连接列(和join相关)、条件列(where子句后的列)、查询列(select的列)

一个好的执行计划分为这几个重点: 访问路径、连接方式、连接顺序

 

2、优化目标:最快响应时间

 

3、查询优化器通过 “分析所有可用的执行方式” 和 “查询所涉及的对象统计信息来寻找最小代价” 来生成最优的执行计划。
此外,如果存在 HINT 优化提示,优化器还需要考虑优化提示的因素。
 
4、查询语句中 FROM 子句包含多个表时,我们称为连接查询,生成连接查询的执行计划需要考虑三方面因素:  访问路径、连接方式、连接顺序
 
5、统计信息:
对象统计信息描述数据是如何在数据库中存储的。在执行查询时,如果数据对象存在统计信息,代价算法可以根据统计信息中的数据,比较精确地计算出操作所需花费的成本,以此来确定对象访问路径、连接方式、连接顺序,选择最优的执行计划。
 

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在页面中排序。

 

posted @ 2021-04-25 15:30  Eric-Shen  阅读(346)  评论(0编辑  收藏  举报