https://www.bilibili.com/video/BV1mE411G7d1?p=1
1.0 发现不良sql
2.0 查看执行计划
select * from table(dbms_xplan.display_cursor('sql_id',null));
https://www.cnblogs.com/gull/p/5547905.html
3.0 b站hugecai 的sql 优化视频 笔记
https://www.bilibili.com/video/BV1J5411P7H5
2.0 统计信息
#统计信息对于sql 语句的优化很重要
#错误的统计信息将导致优化器错误的选择
#查询出现效率问题时, 有可能不是语句的问题,而是统计信息的问题
#oracle 数据库于每天22:00--2:00自动 更新所有统计信息
#使用一下语句可以手工更新统计信息
execute dbms_stats.gather_table_stats($user_name, $table_name);
其中$user_name 和 $table_name 要用表的归属用户名和表名替代
3.0 返回查询结果的过程
#返回查询语句的执行结果可能经过一个或多个提取调用,每次返回满足查询结果的一部分数据行
#除了获取数据(fetch)以外, 解析(parse)、绑定(bind)、执行(execute)只执行一次
#可能需要fetch 多次才能返回满足条件的数据
# 一次fetch 将返回缓冲区缓存中的一个或多个数据块,将其中一些数据行(行数量由Arraysize决定),返回
客户端
# sql*plus 中Arraysize 默认大小为15,可以使用set Arraysize n 命令改变
# JDBC 中Arraysize 默认大小为10,可以使用((OracleConnection)conn).setDefaultRowPrefetch(n)改变
#较大的Arraysize 可以减少FETCH 调用次数
4.0 sql语句的执行过程
4.0 访问和联结的方法
4.1 数据访问方法
# 硬解析,由优化器决定访问数据的方式
-全扫描:全表扫描、快速全索引扫描
-表的统计信息决定成本估计值
4.3 全扫描
# 所有数据块都被读入内存,取出块中数据行进行检索
# 全扫描需要考虑:
--数据块的数量
-- 多少数据被舍弃
4.4 全表扫描选择规则
# 当查询需要返回表中较多数据行时,倾向于全表扫描
# 上一条规则不总是对的
# 即使返回数据行百分比很小,也有可能全表扫描
# 即使返回数据百分比很高,也有可能不选择全表扫描
# 全表扫描选择的几个要素:
-- 访问的数据块个数
-- 最终结果集行数
--舍弃的行数
4.5 全表扫描和索引扫描案例
其中 exec dbms_stats.gather_table 的 是执行统计计划
4.6 查看执行计划
4.7 案例分析
4.8 全扫描与舍弃
4.9 高水位线
块 block 的最大值和最小值
4.10 删除某个表的所有数据之后,还是有高水位线案例
匿名块
用delete 删除所有数据
查看这张表占用的 块
查看统计信息
用truncate 删除表 重置 HWM
(有分区加分区)
重新查看执行计划
图中 00:00:33 应该是 00:00:00
结论
5.0 索引检索
5.1 案例分析
5.2 索引结构
5.3 索引扫描类型
前两个为常用