WEB开发网
开发学院数据库Oracle ORACLE学习笔记--性能优化 阅读

ORACLE学习笔记--性能优化

 2007-05-08 12:10:58 来源:WEB开发网   
核心提示: 在正常情况下,where a=? and b=? and c=?会用到索引inx_a,ORACLE学习笔记--性能优化(5),where b=?会用到索引inx_b,但是,也是一个不错的方法:select /*+ no_index(t,inx_b) */ * from test twher

在正常情况下,where a=? and b=? and c=?会用到索引inx_a,where b=?会用到索引inx_b,但是,where a=? and b=? and c=? group by b会用到哪个索引呢?在分析数据不正确(很长时间没有分析)或根本没有分析数据的情况下,oracle往往会使用索引inx_b。通过执行计划的分析,这个索引的使用,将大大耗费查询时间。

当然,我们可以通过如下的技巧避免使用inx_b,而使用inx_a。

where a=? and b=? and c=? group by b||'' --如果b是字符

where a=? and b=? and c=? group by b+0 --如果b是数字

通过这样简单的改变,往往可以是查询时间提交很多倍

当然,我们也可以使用no_index提示,相信很多人没有用过,也是一个不错的方法:

select /*+ no_index(t,inx_b) */ * from test t

where a=? and b=? and c=? group by b

举例:

本来在CM_USER上有索引IDX_CM_USER4(ACC_ID)和IDX_CM_USER8(BILL_ID),可是执行如下语句的时候很慢。

select * from CM_USER where acc_id =1200007175

and user_status>0 and bill_id like '13%' order by acc_id,bill_id

用explain分析,发现执行计划是用IDX_CM_USER8.如下查询

select * from user_indexes where table_name ='CM_USER' 发现IDX_CM_USER8没有分析过。

用下面语句执行计划改变

select /*+INDEX(CM_USER IDX_CM_USER4)*/* from CM_USER where acc_id =1200007175 and user_status>0 and bill_id like '13%' order by acc_id,bill_id

或者分析索引

exec dbms_stats.gather_index_stats(ownname => 'QACS1',indname => 'IDX_CM_USER8',estimate_percent => 5 );

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:ORACLE 学习 笔记

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接