oracle sql调优

1.sql走索引分析
explain plan for select语句
select * from table(dbms_xplan.display);
2.explain执行顺序
在这里插入图片描述
sql执行过程有两个规则
①根据Operation缩进判断,缩进最多的最先执行
②Operation缩进相同时,最上面的是最先执行的
如图执行计划,根据规则可以得出执行顺序:
INDEX UNIQUE SCAN -> TABLE ACCESS BY INDEX ROWID -> INDEX RANGE SCAN  -> NESTED LOOPS -> INDEX UNIQUE SCAN -> NESTED LOOPS -> TABLE ACCESS BY INDEX ROWID -> NESTED LOOPS -> SELECT STATEMENT

Cost(%CPU)计算方式
select cost, cpu_cost, io_cost from v$sql_plan sql where sql.plan_HASH_VALUE = '864433273';

%CPU = (COST - IO_COST) / COST

3.组合索引顺序问题
index(a,b,c)
遵循索引左前缀原则
where条件不包含列a,则不走索引
走索引方式[ a,  (a,b或b,a), (a,c或c,a), (a,b,c 或 a,c,b 或 b,a,c 或 b,c,a 或 c,a,b 或 c,b,a)]

4.oracle索引失效
1.隐式类型转换导致索引失效
由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效
错误示例:select * from test where tu_mdn=13333333333
正确示例:select * from test where tu_mdn='13333333333'

2. 对索引列进行运算导致索引失效,运算符(+,-,*,/,! 等)
错误示例:select * from test where id-1=9
正确示例:select * from test where id=10

3. 使用Oracle内部函数导致索引失效.对于这样情况应当创建基于函数的索引
错误示例:select * from test where round(id)=10;  这时id的索引无效
正确示例:首先建立函数索引,create index func_idx on test(round(id));    
                  select * from test where  round(id)=10;  这时函数索引起效

4.以下使用会使索引失效,应避免使用
a. 使用 <> 、not in 、not exist、!=
b. like "%_" 百分号在前(可采用在建立索引时用reverse(columnName)这种方法处理)
c. 单独引用复合索引里非第一位置的索引列.应总是使用索引的第一个列,如果索引是建立在多个列上, 只有在它的第一个 列被where子句引用时,优化器才会选择使用该索引
d. 字符型字段为数字时在where条件里不添加引号
e. 当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况

5.不要将空的变量值直接与比较运算符(符号)比较
如果变量可能为空,应使用 IS NULL 或 IS NOT NULL 进行比较,或者使用 ISNULL 函数

6.Tree索引 IS NULL 不会走, IS NOT NULL会走    位图索引 IS NULL, IS NOT NULL 都会走    联合索引 IS NOT NULL 只要在建立的索引列(不分先后)都会走

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值