sql优化核心思想读书笔记

2022-05-01  本文已影响0人  听雪10

oracle存储:block extent segment (clob字段影响:单独存放一个段)
10046事件监控等待事件 10046 trace文件
等待事件为db file sequential read。

第三章 执行计划

3.1、获取和查看执行计划

第一种方式 :set autot

set autot on:该命令会运行SQL并且显示运行结果,执行计划和统计信息。
set autot trace:该命令会运行SQL,但不显示运行结果,会显示执行计划和统计信息。
set autot trace exp:运行该命令查询语句不执行,DML语句会执行,只显示执行计划。
set autot trace stat:该命令会运行SQL,只显示统计信息。
set autot off:关闭AUTOTRACE。

统计信息解读


recursive calls
表示递归调用的次数。一个SQL第一次执行就会发生硬解析,在硬解析的时候,优化器会隐含地调用一些内部SQL,因此当一个SQL第一次执行,recursive calls会大于0;第二次执行的时候不需要递归调用,recursive calls会等于0。
SQL语句中有自定义函数,recursive calls就会显示为自定义函数被调用了多少次

db block gets
表示有多少个块发生变化,一般情况下,只有DML语句才会导致块发生变化,所以查询语句中db block gets一般为0。如果有延迟块清除,或者SQL语句中调用了返回CLOB的函数,db block gets也有可能会大于0,不要觉得奇怪。

consistent gets
表示逻辑读,单位是块。在进行SQL优化的时候,我们应该想方设法减少逻辑读个数。通常情况下逻辑读越小,性能也就越好。需要注意的是,逻辑读并不是衡量SQL执行快慢的唯一标准,需要结合I/O等其他综合因素共同判断。

physical reads
表示从磁盘读取了多少个数据块,如果表已经被缓存在buffer cache中,没有物理读,physical reads等于0。

redo size
表示产生了多少字节的重做日志,一般情况下只有DML语句才会产生redo,查询语句一般情况下不会产生redo,所以这里redo size为0。如果有延迟块清除,查询语句也会产生redo。

bytes sent via SQLNet to client
表示从数据库服务器发送了多少字节到客户端。
bytes received via SQL
Net from client
表示从客户端发送了多少字节到服务端。

SQL*Net roundtrips to/from client
表示客户端与数据库服务端交互次数,我们可以通过设置arraysize减少交互次数。

sorts (memory)和sorts (disk)
分别表示内存排序和磁盘排序的次数。

rows processed
表示SQL一共返回多少行数据。我们在做SQL优化的时候最关心这部分数据,因为可以根据SQL返回的行数判断整个SQL应该是走HASH连接还是走嵌套循环。如果rows processed很大,一般走HASH连接;如果rows processed很小,一般走嵌套循环。

第二种方式:explain plan for sql_str

还可设置advanced-projection, 查看高级执行计划,高级执行计划比普通执行计划多了Query Block Name/Object Alias和Outline Data。

第三种方式:带有A-TIME的执行计划

alter session set statistics_level=all
Starts表示这个操作执行的次数。
E-Rows表示优化器估算的行数,就是普通执行计划中的Rows。
A-Rows表示真实的行数。
A-Time表示累加的总时间。
与普通执行计划不同的是,普通执行计划中的Time是假的,而A-Time是真实的。
Buffers表示累加的逻辑读。
Reads表示累加的物理读。

三种方式不同点:

查看正在执行的SQL的执行计划

需要获取SQL的SQL_ID以及SQL的CHILD_NUMEBR

第四章 访问路径 access path

4.1常见访问路径

TABLE ACCESS FULL

表示全表扫描,一般情况下是多块读,HINT: FULL(表名/别名)

TABLE ACCESS BY USER ROWID

表示直接用ROWID获取数据,单块读。该访问路径在Oracle所有的访问路径中性能是最好的。

TABLE ACCESS BY ROWID RANGE

表示ROWID范围扫描,多块读。因为同一个块里面的ROWID是连续的,同一个EXTENT里面的ROWID也是连续的,所以可以多块读。
where条件中直接使用rowid进行范围扫描就会使用该执行计划。

TABLE ACCESS BY INDEX ROWIDT

表示回表,单块读。

INDEX UNIQUE SCAN

表示索引唯一扫描,单块读。对唯一索引或者对主键列进行等值查找,就会走INDEX UNIQUE SCAN。因为对唯一索引或者对主键列进行等值查找,CBO能确保最多只返回1行数据,所以这时可以走索引唯一扫描。
其性能仅次于TABLE ACCESS BY USER ROWID

INDEX RANGE SCANINDEX RANGE SCAN

表示索引范围扫描,单块读,返回的数据是有序的(默认升序)。HINT: INDEX(表名/别名 索引名)。对唯一索引或者主键进行范围查找,对非唯一索引进行等值查找,范围查找,就会发生INDEX RANGESCAN。
在检查执行计划的时候我们要注意索引范围扫描返回多少行数据,如果返回少量数据,不会出现性能问题;如果返回大量数据,在没有回表的情况下也还好;如果返回大量数据同时还有回表,这时我们应该考虑通过创建组合索引消除回表或者使用全表扫描来代替它。

INDEX SKIP SCANINDEX SKIP SCAN

表示索引跳跃扫描,单块读。返回的数据是有序的(默认升序)。HINT: INDEX_SS(表名/别名 索引名)。当组合索引的引导列(第一个列)没有在where条件中,并且组合索引的引导列/前几个列的基数很低,where过滤条件对组合索引中非引导列进行过滤的时候就会发生索引跳跃扫描

上一篇下一篇

猜你喜欢

热点阅读