【发布时间】:2016-02-21 16:14:54
【问题描述】:
我有一张桌子
index_test(id number,empid number,name varchar2(30));
我在 empid 和 name 列上创建了一个复合索引。
我正在测试一个概念,当我使用 OR 子句时不使用索引。
所以我写了这个查询
select * from index_test where empid='950604' or name='5OMVXGH6G5';
但我得到了一个出乎我意料的结果。它确实使用索引,但也扫描整个表。请帮助我了解这里发生了什么。
这是计划-
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2255565997
--------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 11 | 231 | 9695 (1)| 00:01:57 |
| 1 | CONCATENATION | | | | | |
|* 2 | TABLE ACCESS FULL | INDEX_TEST | 1 | 21 | 9682 (1)| 00:01:57 |
| 3 | TABLE ACCESS BY INDEX ROWID| INDEX_TEST | 10 | 210 | 13 (0)| 00:00:01 |
|* 4 | INDEX RANGE SCAN | SAMPLE_INDEX_INDEX_TEST | 10 | | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("NAME"='5OMVXGH6G5')
4 - access("EMPID"=950604)
filter(LNNVL("NAME"='5OMVXGH6G5'))
【问题讨论】:
-
“直奔主题”是矛盾的说法。下次,请直接说出您的问题,而不是包括问候和这些无意义的短语:) 无论如何,我们是来帮忙的!
-
另外,不要仅仅链接到在我们的浏览器中可能无法正常工作的内容。刚刚在您的问题中包含了一个详细的解释你期望得到什么以及你实际得到什么。
-
“我得到了一个意想不到的结果”,是的,但是您做了什么?
-
@Asfakul Islam 请运行命令:
explain plan for select * from ...... (rest your query)然后SELECT * FROM table( DBMS_XPLAN.Display),然后复制最后一个查询的结果(请将其复制为文本!!!!- 不是 html,不是位图等等。请同时复制整个解释计划,包括打印在计划底部的“谓词信息”)并将其附加到问题中。您在此链接中显示的计划(作为 html)不完整且不可读。谢谢。 -
@kordirko 感谢 Kordiko。我已将计划包括在内。