使用索引的误区之二:使用了和!=操作符,导致查询不使用索引
来源:互联网 发布:北京ps软件培训 编辑:程序博客网 时间:2024/04/30 16:15
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
首先,请记住这个结论:
使用了<>和!=后,就不会使用索引
例如,下面的例子使用了<>,所以查询没有用到索引
selectempnofromempwhereempno<>10;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
|Id |Operation | Name |Rows |Bytes|Cost |
--------------------------------------------------------------------
| 0|SELECTSTATEMENT | | | | |
|* 1| TABLEACCESSFULL |EMP | | | |
--------------------------------------------------------------------
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
1-filter("EMP"."EMPNO"<>10)
Note:rulebasedoptimization
14rowsselected
将上面的查条件“empno<>10”转换成“empno<10andempno>10”后,就可以使用索引了
selectempnofromempwhereempno<10andempno>10;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
|Id |Operation | Name |Rows |Bytes|Cost |
--------------------------------------------------------------------
| 0|SELECTSTATEMENT | | | | |
|* 1| INDEXRANGESCAN |EMP_ID1 | | | |
--------------------------------------------------------------------
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
1-access("EMP"."EMPNO">10AND"EMP"."EMPNO"<10)
Note:rulebasedoptimization
14rowsselected
SQL>
再看下面的例子:
由于使用了前导列,所以使用了索引,后面的"!="是从索引范围扫描的结果中筛选合适的记录的
selectempnofromempwhereempno<=10andename!='RICH';
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
|Id |Operation | Name |Rows |Bytes|Cost |上一页
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
使用索引的误区之二:使用了<>和!=操作符,导致查询不使用索引首先,请记住这个结论:
使用了<>和!=后,就不会使用索引
例如,下面的例子使用了<>,所以查询没有用到索引
selectempnofromempwhereempno<>10;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
|Id |Operation | Name |Rows |Bytes|Cost |
--------------------------------------------------------------------
| 0|SELECTSTATEMENT | | | | |
|* 1| TABLEACCESSFULL |EMP | | | |
--------------------------------------------------------------------
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
1-filter("EMP"."EMPNO"<>10)
Note:rulebasedoptimization
14rowsselected
将上面的查条件“empno<>10”转换成“empno<10andempno>10”后,就可以使用索引了
selectempnofromempwhereempno<10andempno>10;
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
|Id |Operation | Name |Rows |Bytes|Cost |
--------------------------------------------------------------------
| 0|SELECTSTATEMENT | | | | |
|* 1| INDEXRANGESCAN |EMP_ID1 | | | |
--------------------------------------------------------------------
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
1-access("EMP"."EMPNO">10AND"EMP"."EMPNO"<10)
Note:rulebasedoptimization
14rowsselected
SQL>
再看下面的例子:
由于使用了前导列,所以使用了索引,后面的"!="是从索引范围扫描的结果中筛选合适的记录的
selectempnofromempwhereempno<=10andename!='RICH';
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------
|Id |Operation | Name |Rows |Bytes|Cost |上一页
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 使用索引的误区之二:使用了 和 != 操作符,导致查询不使用索引
- 使用索引的误区之二:使用了 和 != 操作符,导致查询不使用索引
- 使用索引的误区之二:使用了和!=操作符,导致查询不使用索引
- 使用索引的误区之二:使用了 和 != 操作符,导致查询不使用索引
- 使用索引的误区之二:使用了 和 != 操作符,导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引——oracle
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- SQL优化-索引 (二)结合实际,谈索引使用的误区
- 使用索引的误区之三:基于函数的索引
- 使用索引的误区之三:基于函数的索引
- 使用索引的误区之三:基于函数的索引
- 使用索引的误区之三:基于函数的索引
- 谈索引使用的误区
- Oracle 使用索引和不使用索引的举例
- mysql 使用索引和不使用索引的区别
- 男人必知的9道最佳解酒食品
- 使用索引的误区之四:空值对索引的影响
- 请到我的百度空间来
- 使用索引的误区之三:基于函数的索引
- 喜欢对联的皇帝朱元璋
- 使用索引的误区之二:使用了和!=操作符,导致查询不使用索引
- 使用索引的误区之一:没有使用复合索引的前导列导致查询不使用索引
- 概论笔记(第三天)
- 利用存储过程简化操作
- 通过function解决部分复杂查询的方法
- 数字签名大碰撞
- 精简出最小 jre
- 利用动态SQL解决排序问题
- SQLServer驱动程序版本造成的中文问题。