or和rownum同时使用的索引问题

fosjos 2009-04-08 02:16:36
表table的字段col加了索引
select * from table where (col='a' or col='b') and rownum<=10;

直接这样写,没做任何解释分析,结果没有用到索引
必须要加上hint

想问的是,有没有直接点的sql写法,既用到索引,又无需加hint
最好别用嵌套语句
...全文
239 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
fuyou001 2009-04-09
  • 打赏
  • 举报
回复
来学习的
fosjos 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 superhsj 的回复:]
select * from table where (col='a' and rownum <=10) or (col='b' and rownum <=10);
这样不知道行不
[/Quote]
嗯,我试过了,计划和最初的那个类似

其实只要有oracle ,都可以试试,col用主键就可以了(其实最郁闷的是:主键居然也不去用索引)
加上/*+index(table)*/ ,和不加的解释计划差别很大
superhsj 2009-04-09
  • 打赏
  • 举报
回复
select * from table where (col='a' and rownum<=10) or (col='b' and rownum<=10);
这样不知道行不
yf520gn 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 fosjos 的回复:]
一共上百万,in ('a','b')大概百十条
因为是别人提供的查询库,所以最好不用执行分析

比如身份证查询,数据中有老号码和新号码
[/Quote]
那返回记录数的影响就排除了~~
fosjos 2009-04-09
  • 打赏
  • 举报
回复
有碰到过类似问题的吗?
fosjos 2009-04-08
  • 打赏
  • 举报
回复
一共上百万,in ('a','b')大概百十条
因为是别人提供的查询库,所以最好不用执行分析

比如身份证查询,数据中有老号码和新号码
yf520gn 2009-04-08
  • 打赏
  • 举报
回复
select COUNT(*) from table where col in ('a','b')

SELECT COUNT(*) FROM TABLE
数据各是多少呢?
fosjos 2009-04-08
  • 打赏
  • 举报
回复
楼上几位说的我也想了,但哪怕col是主键,都默认用full scan
[Quote=引用 4 楼 Allan_xd 的回复:]
下面的语句试过没?
select * from table where col in ('a','b') and rownum <=10;
[/Quote]oracle会解析成or,没啥区别

看来还是嵌套最直接,效率影响也不大
select * from (select * from table where col like 'a%' or col like 'b%')
where rownum<=10;

哪位大大有不同见解,请指点一二
randy_ideal 2009-04-08
  • 打赏
  • 举报
回复
oracle的rbo方式有其既定的规则,而且也可能不按oracle说明的规则。
对于oracle的优化器,不能完全相信oracle的官方文档说明,如果遇到特别耗资源的sql,一般都是自己根据数据组织情况,加hint强制调优。至于为什么楼主的语句没有使用索引,who knows,哈哈。
jdsnhan 2009-04-08
  • 打赏
  • 举报
回复
CBO模式下,oracle自己选择是否走索引。
Allan_xd 2009-04-08
  • 打赏
  • 举报
回复
下面的语句试过没?
select * from table where col in ('a','b') and rownum<=10;
fosjos 2009-04-08
  • 打赏
  • 举报
回复
原先是 col='a'或者col like 'a%' ,加上rownum<=10没问题
现在需求增加了col='a' or col='b'或者col like 'a%' or col like 'b%'

突然发现不加hint,居然不用索引
oracledbalgtu 2009-04-08
  • 打赏
  • 举报
回复
index不一定就比full scan table快啊,在数据量较少的情况下走fst是正常的.
对于大表如果返回的数据很多,也可能会走fst.如果走index会更慢.


[Quote=引用楼主 fosjos 的帖子:]
表table的字段col加了索引

SQL codeselect * from table where (col='a' or col='b') and rownum<=10;


直接这样写,没做任何解释分析,结果没有用到索引
必须要加上hint

想问的是,有没有直接点的sql写法,既用到索引,又无需加hint
最好别用嵌套语句
[/Quote]
sleepzzzzz 2009-04-08
  • 打赏
  • 举报
回复
你这样表达是已经够简洁的了.
比较下查询返回的速度吧,CBO的方式不一定会走索引.col列如果仅几个值的话,可以试一下位图索引.

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧