目录
优化器
查询优化器通过分析可用的执行方式和查询所涉及的对象统计信息来生成最优的执行计划。此外,如果存在 HINT 优化提示,优化器还需要考虑优化提示的因素。
查询优化器的处理过程包括:
1.优化器生成所有可能的执行计划集合;
2.优化器基于字典信息的数据分布统计值、执行语句涉及到的表、索引和分区的存储特点来估算每个执行计划的代价。代价是指 SQL 语句使用某种执行方式所消耗的系统资源的估算值。其中,系统资源消耗包括 I/O、CPU 使用情况、内存消耗等;
3.优化器选择代价最小的执行方式作为该条语句的最终执行计划。
优化器所做的操作有:查询转换、估算代价、生成计划。
执行计划
生成计划指计划生成器对给定的查询按照连接方式、连接顺序、访问路径生成不同的执行计划,选择代价最小的一个作为最终的执行计划。
查看执行计划
- 通过EXPLAIN命令查看
- 通过管理工具查看
操作符
CSCN :基础全表扫描(a),从头到尾,全部扫描
SSCN :二级索引扫描(b), 从头到尾,全部扫描
SSEK :二级索引范围扫描(b) ,通过键值精准定位到范围或者单值
CSEK :聚簇索引范围扫描 ,通过键值精准定位到范围或者单值
BLKUP :根据二级索引的ROWID 回原表中取出全部数据(b + a)
NSET:用于结果集收集的操作符,一般是查询计划的顶层节点
PRJT:关系的“投影”(project)运算,用于选择表达式项的计算;
SLCT:关系的“选择” 运算,用于查询条件的过滤。
AAGR:简单聚集,用于没有group by的count sum age max min等聚集函数的计算
FAGR:快速聚集,用于没有过滤条件时从表或索引快速获取MAX/MIN/COUNT值
HAGR:分组聚集,用于分组列没有索引只能走全表扫描的分组聚集,C2列没有创建索引
SAGR:流分组聚集,用于分组列是有序的情况下,可以使用流分组聚集,C1上已经创建了索引,SAGR2性能优于HAGR2
准备测试表和数据
DROP TABLE T1;
DROP TABLE T2;
CREATE TABLE T1(C1 INT ,C2 CHAR(1),C3 VARCHAR(10) ,C4 VARCHAR(10) );
CREATE TABLE T2(C1 INT ,C2 CHAR(1),C3 VARCHAR(10) ,C4 VARCHAR(10) );
INSERT INTO T1
SELECT LEVEL C1,CHR(65+MOD(LEVEL,57)) C2,'TEST',NULL FROM DUAL
CONNECT BY LEVEL<=10000;
INSERT INTO T2
SELECT LEVEL C1,CHR(65+MOD(LEVEL,57)) C2,'TEST',NULL FROM DUAL
CONNECT BY LEVEL<=10000;
CREATE INDEX IDX_C1_T1 ON T1(C1);
SP_INDEX_STAT_INIT(USER,'IDX_C1_T1');
CSCN 全表扫
explain select * from t1 where c2='test';
BLKUP 回表查找
EXPLAIN SELECT * FROM T1 WHERE C1=10;
SSEK 索引范围扫
explain select c1 from t1 where c1 < 100;
SSCN 索引全表扫
explain select c1 from t1;
CSEK 聚簇索引扫
CREATE CLUSTER INDEX IDX_C1_T2 ON T2(C1);
EXPLAIN SELECT * FROM T2 WHERE C1=10;
AAGR 简单聚集 没有groupby的简单聚集
EXPLAIN SELECT COUNT(*) FROM T1 WHERE C1 = 10;
FAGR 快速聚集 没有过滤条件
EXPLAIN SELECT COUNT(*) FROM T1 ;
HAGR HASH分组聚集 没有走索引的groupby
EXPLAIN SELECT COUNT(*) FROM T1 GROUP BY C2;
SAGR 流分组聚集 有索引的groupby
EXPLAIN SELECT COUNT(*) FROM T1 GROUP BY C1;
执行过程
建表和建索引语句:
CREATE TABLE T1(C1 INT,C2 CHAR);
CREATE TABLE T2(D1 INT,D2 CHAR);
CREATE INDEX IDX_T1_C1 ON T1(C1);
INSERT INTO T1 VALUES(1,'A');
INSERT INTO T1 VALUES(2,'B');
INSERT INTO T1 VALUES(3,'C');
INSERT INTO T1 VALUES(4,'D');
INSERT INTO T2 VALUES(1,'A');
INSERT INTO T2 VALUES(2,'B');
INSERT INTO T2 VALUES(5,'C');
INSERT INTO T2 VALUES(6,'D');
执行计划:
EXPLAIN SELECT A.C1+1,B.D2 FROM T1 A, T2 B WHERE A.C1 = B.D1;
执行过程:
控制流从上向下传递,数据流从下向上传递。[1,12,56]分别表示估算的操作符代价(毫秒)、处理的记录行数和每行记录的字节数。
该计划的大致执行流程如下:
1.CSCN2,扫描 T2 表的聚集索引,结果返回给父节点;
2.父节点NEST LOOP将数据作为左孩子,取右侧数据
3.SSEK2,利用T2表的D1列索引IDX_T1_C1,结果返回给父节点;
4.父节点NEST LOOP将数据作为右孩子,将连接结果返回PRJT2
5.PRJT2:进行表达式计算 C1+1, D2;
6.NSET2: 输出最后结果;
7.重复以上,至CSCN2 数据全部取完。