暂无图片
Oracle 查询条件里字段顺序一定要和索引相一致才调用索引么
我来答
分享
Thomas
2023-08-27
Oracle 查询条件里字段顺序一定要和索引相一致才调用索引么

如题。

比如索引是基于col_a,col_b建立。如果where col_a=xx and col_b=yy, 自然会用到索引。但据说,如果where col_b=yy and col_a=xx就不会使用索引。我想,ORACLE的优化器就这么呆板么。通过试验,发现好像不是那么回事。请专家指点一二:

create table tbtbtb (id1 integer,id2 integer);

insert into tbtbtb select level,mod(level,100) from dual connect by level<10001;

commit;

create index idx_tbtbtb on tbtbtb(id1,id2);

Index created.

SQL> set autotrace traceonly;

按照索引次序加条件
SQL> select * from tbtbtb where id1=4567 and id2=19;

no rows selected

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 515734133

-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 26 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| IDX_TBTBTB | 1 | 26 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("ID1"=4567 AND "ID2"=19)


不按索引次序加条件,似乎也用到了索引
SQL> select * from tbtbtb where id2=19 and id1=4567;

no rows selected

Elapsed: 00:00:00.01

Execution Plan
----------------------------------------------------------
Plan hash value: 515734133

-------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 26 | 1 (0)| 00:00:01 |
|* 1 | INDEX RANGE SCAN| IDX_TBTBTB | 1 | 26 | 1 (0)| 00:00:01 |
-------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("ID1"=4567 AND "ID2"=19)

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
广州_老虎刘

这个“据说”是非常不靠谱的, 即便退回到20多年前的8版本,优化模式使用RBO, 字段顺序在where条件里面也是随便写的,都是能够正常使用索引的。

暂无图片 评论
暂无图片 有用 0
打赏 0
暂无图片
回答交流
Markdown


请输入正文
提交
相关推荐
AHF orachk是什么
回答 2
AHF打错了
手工dd了undo数据文件后,DB实例不能开启
回答 3
这种情况非常复杂,遇到的问题也会是多种多样,最佳方式是有备份。如果没有备份是很难解决的,生产可以找恩墨救援。如果自己研究,参考以下几个文章:https://www.eygle.com/archives
我要利用备份恢复数据库,但是我没有控制文件,怎么办?
回答 1
已采纳
可以试试DBMSBACKUPRESTORE。这里假定是nocatalog的情况下,并且采用了RMAN备份,但是丢失了控制文件,因为控制文件中包含了rman的备份信息,所以没有办法用平常的方法来恢复,如
tablespace使用率
回答 4
1、采集快照数据2、用PYTHONOR&nbsp;其它角本自己编写工具、OR&nbsp;执地写SQL角本生成HMTL报告(如AWR就是SQL生成)
Oracle insert 违反唯一约束条件的怎么跳过?
回答 1
已采纳
在命令行执行会自动跑下一条inert语句或者放sql脚本里面跑
两个oracle数据库,不同的两个表,怎么根据数据库中相同的值,进行其他字段同步
回答 2
DBLINKMERGEINTO
oracle监听本来是可以起来的,但是忽然连不上数据库,所以我把原来的监听文件删除了,之后重现安装发现如下问题:主机名也有对应上,就忽然起不来了,是不是jvm空间满了,如果是要怎么释放呢?
回答 1
已采纳
这个我看昨天就已经问过了,要是没解决问题,可详细描述一下版本,环境,删除方法,为何要静默重建?如果是单机环境,复制一个其他主机的listener.ora.或者用下面的替换cd$ORACLEHOME/n
Oracle数据库备份dmp文件太大,有什么办法可以在备份的时候拆分成多个dmp吗?
回答 4
已采纳
建导出的时候,按时间或其它条件进行拆分导出。然后写一个shell脚本循环导出:示例:vimpar.pardirectoryDPDIRdumpfilet1.dmptablest1queryt1:&quo
AWR分析报告问题求助:队列等待时间超过100s,平均等待时间超过100ms,建议针对该队列进行优化
回答 1
AWR报告应该是着重从等待事件和TOPSQL看问题
oracle产品
回答 2
已采纳
21是大版本。后面是小版本。12c就是12.0.118c就是12。0.219c就是12.0.3以前11g也有11.0.2.3和11.0.2.4