请教优化的问题

[复制链接]
查看11 | 回复4 | 2005-5-12 01:01:35 | 显示全部楼层 |阅读模式
select *
from table
where A=:X1
and B=:X3
and C=:X4
有复合索引create index IDX0 on table(A, E, C, B)
现在的执行计划是
index range scan
table access by index rowid
filter
我把查询改成
select *
from table
where A=:X1
and B=:X2
and C=:X4
执行计划是
index range scan
table access by index rowid
这样就不用filter了,省去了很多时间,但是这样又不复合逻辑
我的想法是在第一个查询的时候就不要filter了,因为我建了B栏位的索引呀,难道是>=,=:X3
and C=:X4
如果把X1,X2改成常量的话
执行计划是
index range scan
table access by index rowid
回复

使用道具 举报

千问 | 2005-5-12 01:01:35 | 显示全部楼层
那你单独把X2变成常量看看。
回复

使用道具 举报

千问 | 2005-5-12 01:01:35 | 显示全部楼层
最初由 qiaoruzhi78 发布
[B]那你单独把X2变成常量看看。 [/B]

单独改X2为常量也是要filter的
单独改X1为常量同样filter
回复

使用道具 举报

千问 | 2005-5-12 01:01:35 | 显示全部楼层
类似B>= .. and B=30 and B<=15,如果是这种情况,通过filter就可以知道,这种情况一定不返回记录,所以就不继续执行下面的执行计划了。
反之,如果你不使用绑定变量,则oracle会直接认出这种情况,于是不会进行filter操作。
回复

使用道具 举报

千问 | 2005-5-12 01:01:35 | 显示全部楼层
哦,知道了,应该是使用变量的时候,他会去过滤掉非变量的值,实际过程中应该是一样的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行