使用索引的误区之二:使用了 和 != 操作符,导致查询不使用索引
来源:互联网 发布:tv域名注册 编辑:程序博客网 时间:2024/05/18 03:23
使用索引的误区之二:使用了 <> 和 != 操作符,导致查询不使用索引
首先,请记住这个结论:
使用了<> 和!=后,就不会使用索引
例如,下面的例子使用了<>,所以查询没有用到索引
select empno from emp where empno <>10;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
|* 1 | TABLE ACCESS FULL | EMP | | | |
--------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("EMP"."EMPNO"<>10)
Note: rule based optimization
14 rows selected
将上面的查条件“empno <>
select empno from emp where empno <10 and empno>10;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
|* 1 | INDEX RANGE SCAN | EMP_ID1 | | | |
--------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("EMP"."EMPNO">10 AND "EMP"."EMPNO"<10)
Note: rule based optimization
14 rows selected
SQL>
再看下面的例子:
由于使用了前导列,所以使用了索引,后面的"!="是从索引范围扫描的结果中筛选合适的记录的
select empno from emp where empno <=10 and ename != 'RICH';
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
|* 1 | INDEX RANGE SCAN | EMP_ID1 | | | |
--------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("EMP"."EMPNO"<=10)
filter("EMP"."EMPNO"<=10 AND "EMP"."ENAME"<>'RICH')
Note: rule based optimization
15 rows selected
再做一个试验:
SQL> desc dept
Name Type Nullable Default Comments
------ ------------ -------- ------- --------
DEPTNO NUMBER(2) Y
DNAME VARCHAR2(14) Y
LOC VARCHAR2(13) Y
创建一个单键索引:
SQL> create index dept_id1 on dept(dname);
Index created
如果使用"<>",则查询不使用索引:
select depTno from dept where dname <> 'DEVELOPER';
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
|* 1 | TABLE ACCESS FULL | DEPT | | | |
--------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("DEPT"."DNAME"<>'DEVELOPER')
Note: rule based optimization
14 rows selected
将条件修改为“dname <'DEVELOPER' and dname>'DEVELOPER'”,则可以使用索引
select deptno from dept where dname <'DEVELOPER' and dname>'DEVELOPER';
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | TABLE ACCESS BY INDEX ROWID| DEPT | | | |
|* 2 | INDEX RANGE SCAN | DEPT_ID1 | | | |
---------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("DEPT"."DNAME">'DEVELOPER' AND "DEPT"."DNAME"<'DEVELOPER')
Note: rule based optimization
15 rows selected
SQL>
- 使用索引的误区之二:使用了 和 != 操作符,导致查询不使用索引
- 使用索引的误区之二:使用了 和 != 操作符,导致查询不使用索引
- 使用索引的误区之二:使用了和!=操作符,导致查询不使用索引
- 使用索引的误区之二:使用了 和 != 操作符,导致查询不使用索引
- 使用索引的误区之二:使用了 和 != 操作符,导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引——oracle
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- SQL优化-索引 (二)结合实际,谈索引使用的误区
- 使用索引的误区之三:基于函数的索引
- 使用索引的误区之三:基于函数的索引
- 使用索引的误区之三:基于函数的索引
- 使用索引的误区之三:基于函数的索引
- 谈索引使用的误区
- Oracle 使用索引和不使用索引的举例
- mysql 使用索引和不使用索引的区别
- BT原理分析
- X$表
- Win 2000常用系统进程列表详解
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 国内各大知名公司薪酬 (收藏^^)
- 使用索引的误区之二:使用了 和 != 操作符,导致查询不使用索引
- 不停止计划生育,中国还在等什么?
- 如何保存一个字符串Cookie,在其它WebForm中可以访问到?
- 使用索引的误区之三:基于函数的索引
- 什么是MVC[转贴]
- 使用索引的误区之四:空值对索引的影响
- TeX中修改插图目录样式一例
- C-Sharp调用标准动态库
- 笑话连篇