sql优化小例子
2017-05-22 23:35
197 查看
客户业务系统随着数据量的增大出现运行速度降低问题,通过AWR报告分析发现运行效率低的SQL,如下:
select * from scott.计划产品出生证表 where 序号=(select min(序号) from scott.计划产品出生证表 where 任务单号= ‘xxxx-xxx-xxx’ and 产品状态=’正在执行’)
其执行计划
分析:
执行计划中id=1的SQL通过全表扫描方式获取数据,整体的cost值为851,consistent gets 3802,SQL效率低下。
解决方法:
create index scott.计划产品出生证表_indx_zxq on scott.计划产品出生证表(序号);
效果:
优化后的SQL执行计划执行计划
执行计划中SQL由全表扫描方式改为索引读取方式获取数据,cost值由851降低至15,consistent gets由 3802降低至23, SQL效率明显提高。
select * from scott.计划产品出生证表 where 序号=(select min(序号) from scott.计划产品出生证表 where 任务单号= ‘xxxx-xxx-xxx’ and 产品状态=’正在执行’)
其执行计划
----------------------------------------------------------------------------------------------- Plan hash value: 2054637612 ------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ----------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 131 | 851 (2)| 00:00:11 | |* 1 | TABLE ACCESS FULL | 计划_产品出生证 | 1 | 131 | 838 (2)| 00:00:11 | | 2 | SORT AGGREGATE | | 1 | 29 | | | |* 3 | TABLE ACCESS BY INDEX ROWID| 计划_产品出生证 | 1 | 29 | 13 (0)| 00:00:01 | |* 4 | INDEX RANGE SCAN | 计划_产品出生证 | 366 | | 4 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): ---------------------------------------------------------------------------------------------- 1 - filter("序号"= (SELECT MIN("序号") FROM "SCOTT"."计划_产品出生证表" "计划_产品出生证表" WHERE "产品状态"='正在执行' AND "任务单号"='170511-P22-001')) 3 - filter("任务单号"='170511-P22-001') 4 - access("产品状态"='正在执行') 统计信息 ---------------------------------------------------------- 1 recursive calls 0 db block gets 3802 consistent gets 0 physical reads 0 redo size 1636 bytes sent via SQL*Net to client 374 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 0 rows processed
分析:
执行计划中id=1的SQL通过全表扫描方式获取数据,整体的cost值为851,consistent gets 3802,SQL效率低下。
解决方法:
create index scott.计划产品出生证表_indx_zxq on scott.计划产品出生证表(序号);
效果:
优化后的SQL执行计划执行计划
Plan hash value: 1523355933 -------------------------------------------------------------------------------------------------------- Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | -------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 131 | 15 (0)| 00:00:01 | | 1 | TABLE ACCESS BY INDEX ROWID | 计划_产品出生证表 | 1 | 131 | 2 (0)| 00:00:01 | |* 2 | INDEX RANGE SCAN | 计划_产品出生证表_I | 1 | | 1 (0)| 00:00:01 | | 3 | SORT AGGREGATE | | 1 | 29 | | | |* 4 | TABLE ACCESS BY INDEX ROWID| 计划_产品出生证表 | 1 | 29 | 13 (0) | 00:00:01 | |* 5 | INDEX RANGE SCAN | 计划_产品出生证表_I | 366 | | 4 (0)| 00:00:01 | ----------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 2 - access("序号"= (SELECT MIN("序号") FROM "SCOTT"."计划_产品出生证表" "计划_产品出生证表" WHERE "产品状态"='正在执行' AND "任务单号"='xxxx-xxx-xxx')) 4 - filter("任务单号"='xxxx-xxx-xxx') 5 - access("产品状态"='正在执行') 统计信息 ---------------------------------------------------------- 1 recursive calls 0 db block gets 23 consistent gets 0 physical reads 0 redo size 1636 bytes sent via SQL*Net to client 374 bytes received via SQL*Net from client 1 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 0 rows processed
执行计划中SQL由全表扫描方式改为索引读取方式获取数据,cost值由851降低至15,consistent gets由 3802降低至23, SQL效率明显提高。
相关文章推荐
- 一个查选优化的例子,转--SQL Server中存储过程比直接运行SQL语句慢的原因
- SQL优化基础:使用索引(一个小例子)
- SQL优化基础 使用索引(一个小例子)
- SQL 大数据量的优化例子讨论
- 分享SQL语句一些优化例子
- sql优化例子
- SQL优化基础 使用索引(一个小例子)
- SQL 大数据量的优化例子讨论(转)
- SQL 大数据量的优化例子讨论
- sql优化经典例子
- SQL优化基础 使用索引(一个小例子)
- sql语句优化30例子
- SQL 大数据量的优化例子讨论
- 一则sql优化的例子
- sql优化经典例子
- SQL优化基础 使用索引(一个小例子)
- sql优化经典例子
- SQL优化基础:使用索引(一个小例子)
- 一则sql优化的例子
- 一个查选优化的例子,转--SQL Server中存储过程比直接运行SQL语句慢的原因