oracle 索引未生效

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fengqinyun168/article/details/84796531

不走索引大体有以下几个原因:
• 你在Instance级别所用的是all_rows的方式
• 你的表的统计信息(最可能的原因)
• 你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。
解决方法:
可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint。
不走索引的其它原因:
1、建立组合索引,但查询谓词并未使用组合索引的第一列,此处有一个INDEX SKIP SCAN概念。
2、在包含有null值的table列上建立索引,当时使用select count(*) from table时不会使用索引。
3、在索引列上使用函数时不会使用索引,如果一定要使用索引只能建立函数索引。
4、当被索引的列进行隐式的类型转换时不会使用索引。如:select * from t where indexed_column = 5,而indexed_column列建立索引但类型是字符型,这时Oracle会产生隐式的类型转换,转换后的语句类似于select * from t where to_number(indexed_column) = 5,此时不走索引的情况类似于case3。日期转换也有类似问题,如: select * from t where trunc(date_col) = trunc(sysdate)其中date_col为索引列,这样写不会走索引,可改写成select * from t where date_col >= trunc(sysdate) and date_col < trunc(sysdate+1),此查询会走索引。
5、并不是所有情况使用索引都会加快查询速度,full scan table 有时会更快,尤其是当查询的数据量占整个表的比重较大时,因为full scan table采用的是多块读,当Oracle优化器没有选择使用索引时不要立即强制使用,要充分证明使用索引确实查询更快时再使用强制索引。
6、<>
7、like’%dd’百分号在前。




select status,T.* from user_indexes T
where table_name='T_CHIPIN_TEMP'
展开阅读全文

关于索引生效的问题

11-28

各位大虾们,小弟有个问题不解,望各位给点帮助rnrn我在Table_name 表中建立索引rncreate index I_VEHICLEPASS_COM2 on Table_name (PASSTIME,crosslsh,PLATEINFO)rncreate bitmap index I_VEHICLEPASS_COM1 on Table_name (crosslsh);rnrnselect count(1)rn from TABLE_NAME vrn where passTime >=rn to_timestamp('2011-5-1 00:00:00', 'yyyy-mm-dd HH24:MI:SS')rn and passTime <=rn to_timestamp('2011-5-30 23:59:59', 'yyyy-mm-dd HH24:MI:SS')rn and CROSSLSH in (21)rn and plateInfo like '%'rnrnrn1 Plan hash value: 939785991rn2 rn3 -----------------------------------------------------------------------------------------rn4 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |rn5 -----------------------------------------------------------------------------------------rn6 | 0 | SELECT STATEMENT | | 1 | 23 | 26558 (2)| 00:05:19 |rn7 | 1 | SORT AGGREGATE | | 1 | 23 | | |rn8 |* 2 | FILTER | | | | | |rn9 |* 3 | INDEX RANGE SCAN| I_VEHICLEPASS_COM2 | 293K| 6588K| 26558 (2)| 00:05:19 |rn10 -----------------------------------------------------------------------------------------rn11 rn12 Predicate Information (identified by operation id):rn13 ---------------------------------------------------rn14 rn15 2 - filter(TO_TIMESTAMP('2011-5-1 00:00:00',:B1)<=TO_TIMESTAMP('2011-5-30 rn16 23:59:59',:B2))rn17 3 - access("PASSTIME">=TO_TIMESTAMP('2011-5-1 00:00:00',:B1) AND rn18 "CROSSLSH"=21 AND "PASSTIME"<=TO_TIMESTAMP('2011-5-30 23:59:59',:B2))rn19 filter("CROSSLSH"=21 AND "PLATEINFO" LIKE '%')rnrnrn这里用来索引rnrnrn但是我再加一个条件 就不用索引,而是进行全部扫描rnselect count(1)rn from TABLE_NAME vrn where passTime >=rn to_timestamp('2011-5-1 00:00:00', 'yyyy-mm-dd HH24:MI:SS')rn and passTime <=rn to_timestamp('2011-5-30 23:59:59', 'yyyy-mm-dd HH24:MI:SS')rn and CROSSLSH in (21)rn and plateInfo like '%'rn and drivewayNumber = '1'rnrnrn1 Plan hash value: 477241886rn2 rn3 -------------------------------------------------------------------------------------------rn4 | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |rn5 -------------------------------------------------------------------------------------------rn6 | 0 | SELECT STATEMENT | | 1 | 26 | 205K (3)| 00:41:06 |rn7 | 1 | SORT AGGREGATE | | 1 | 26 | | |rn8 |* 2 | FILTER | | | | | |rn9 |* 3 | TABLE ACCESS FULL| TABLE_NAME | 24445 | 620K| 205K (3)| 00:41:06 |rn10 -------------------------------------------------------------------------------------------rn11 rn12 Predicate Information (identified by operation id):rn13 ---------------------------------------------------rn14 rn15 2 - filter(TO_TIMESTAMP('2011-5-1 00:00:00',:B1)<=TO_TIMESTAMP('2011-5-30 rn16 23:59:59',:B2))rn17 3 - filter("CROSSLSH"=21 AND "DRIVEWAYNUMBER"=1 AND rn18 "PASSTIME"<=TO_TIMESTAMP('2011-5-30 23:59:59',:B1) AND rn19 "PASSTIME">=TO_TIMESTAMP('2011-5-1 00:00:00',:B2) AND "PLATEINFO" LIKE '%')rnrn这是为什么呢? 很困惑啊! 望大虾赐教……!!!rn谢谢! 论坛

没有更多推荐了,返回首页