oracle select count一次优化经历
2013-02-01 15:10
405 查看
优化场景:以下语句执行用时84s,
select count(*)
from t_zz_support_object t1, T_DC_CI_RS_TOP t3
where t1.status = 1
and t1.ci_rs_id = t3.ci_rs_id
and t1.org_id in (
select org_id from t_dc_org_entity_info start with org_id = 3213 connect by prior org_id = parent_org_id
)
优化过程:
@Tony(943004851) 10:40:13
你看看执行计划 返回的基数 是不是和查询的一致
启用10053 事件 跟踪一下
index full scan 和扫描全表几乎差不多
为什么select count(1) from 84秒 select * from 0.015 秒
Tony(943004851) 10:56:40
第一个查询完 要进行一次count操作 这是几乎块操作 要所有的块都查询完 在进行count
第二个是非块操作 即行读取 一行一行的读取
分析@awrpt
前两个语句共用了72.27%的逻辑读,KEY_T_DC_CIRS逻辑读 54%,
1万以上的逻辑读和执行计划里的cost=0显然不符,执行计划说KEY_T_DC_CIRS的全扫描cost为0,和你说的表的数据量很大不符。就是统计信息的问题,你的表数据最近发生大变动了,变动后没有刷新统计信息
手动刷新统计信息语句速度上去了:
begin
dbms_stats.gather_table_stats(ownname => 'zhsq', tabname => 'T_DC_CI_RS_TOP',
estimate_percent => 0.5, method_opt => 'for all columns size skewonly',cascade => TRUE);
end;
执行后的语句执行计划:
怎么看 执行计划是否接近完美
Tony(943004851) 12:30:05
最直观的方法就是 看你执行计划返回的行数或者cardinality(基数) 和你数据表或其他对象 是否一致
还要分析 表、索引和相关列的统计信息 是以统筹的概念和信息
select count(*)
from t_zz_support_object t1, T_DC_CI_RS_TOP t3
where t1.status = 1
and t1.ci_rs_id = t3.ci_rs_id
and t1.org_id in (
select org_id from t_dc_org_entity_info start with org_id = 3213 connect by prior org_id = parent_org_id
)
优化过程:
@Tony(943004851) 10:40:13
你看看执行计划 返回的基数 是不是和查询的一致
启用10053 事件 跟踪一下
index full scan 和扫描全表几乎差不多
为什么select count(1) from 84秒 select * from 0.015 秒
Tony(943004851) 10:56:40
第一个查询完 要进行一次count操作 这是几乎块操作 要所有的块都查询完 在进行count
第二个是非块操作 即行读取 一行一行的读取
分析@awrpt
前两个语句共用了72.27%的逻辑读,KEY_T_DC_CIRS逻辑读 54%,
1万以上的逻辑读和执行计划里的cost=0显然不符,执行计划说KEY_T_DC_CIRS的全扫描cost为0,和你说的表的数据量很大不符。就是统计信息的问题,你的表数据最近发生大变动了,变动后没有刷新统计信息
手动刷新统计信息语句速度上去了:
begin
dbms_stats.gather_table_stats(ownname => 'zhsq', tabname => 'T_DC_CI_RS_TOP',
estimate_percent => 0.5, method_opt => 'for all columns size skewonly',cascade => TRUE);
end;
执行后的语句执行计划:
怎么看 执行计划是否接近完美
Tony(943004851) 12:30:05
最直观的方法就是 看你执行计划返回的行数或者cardinality(基数) 和你数据表或其他对象 是否一致
还要分析 表、索引和相关列的统计信息 是以统筹的概念和信息
相关文章推荐
- 记一次Oracle Sql优化经历--消耗过多CPU
- 优化select count(*) (转oracle培训老师的文章)
- 一次优化web项目的经历记录(二)
- 一次优化web项目的经历记录(三)
- 一次非常有意思的 SQL 优化经历
- 【Oracle 函数索引】一次数据库的优化过程
- 记一次Hbase查询速度优化经历
- 提高Web应用程序的性能--我的一次优化经历
- Oracle性能优化之COUNT
- 一次非常有意思的SQL优化经历
- [Oracle] “表中有数据,但select count(*)的结果为0”问题的解决办法
- 记一次服务器Tomcat优化经历
- 一次非常有意思的 SQL 优化经历
- 记一次生产环境性能压测优化的经历
- 一次 TableView 性能优化经历
- 一次非常有意思的SQL优化经历
- SQL Select count(*)和Count(1)的区别和执行方式及SQL性能优化
- MySQL 的 select count() 优化
- oracle优化之count的优化-避免全表扫描
- SELECT COUNT使用优化 (转自http://hi.baidu.com/dearhwj/blog/item/3a45b28de358031ab31bba1b.html)