expain plan 不走索引的原因总结

本文探讨了Oracle数据库中索引不被使用的多种原因及解决办法。包括统计信息不准确、表大小、索引列使用不当等问题,并提供调整优化器模式等解决方案。

4、为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢 ?

A、不走索引大体有以下几个原因
♀你在Instance级别所用的是all_rows的方式
♀你的表的统计信息(最可能的原因)
♀你的表很小,上文提到过的,Oracle的优化器认为不值得走索引。
B、解决方法
♀可以修改init.ora中的OPTIMIZER_MODE这个参数,把它改为Rule或Choose,重起数据库。也可以使用4中所提的Hint.

补充:不走索引的原因,甚至加上 /*+index(table_name index_name)*/还不走索引,那可能是因为你要走索引的这列是nullable,虽然这列没有空值。

备注 : 不走索引的其它原因

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优化器没有选择使用索引时不要立即强制使用,要充分证明使用索引确实查询更快时再使用强制索引。

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22934571/viewspace-1044191/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22934571/viewspace-1044191/

void SaveData(uint16_t add, uint16_t val) { uint16_t addTemp; uint16_t *addp; uint16_t *addStdMinp; uint16_t *addStdMaxp; uint16_t U16min, U16max; int16_t I16min, I16max; if ((add >= MAINS_CONFIGURE_ADD) && (add < STATE_DELAY_CONFIGURE_ADD)) { addTemp = add - MAINS_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&mainsConfigure); addStdMinp = (uint16_t *)(&(mainsConfigureStd[0])); addStdMaxp = (uint16_t *)(&(mainsConfigureStd[1])); } else if ((add >= STATE_DELAY_CONFIGURE_ADD) && (add < ENGINE_CONFIGURE_ADD)) { addTemp = add - STATE_DELAY_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&stateDelayConfigure); addStdMinp = (uint16_t *)(&(stateDelayConfigureStd[0])); addStdMaxp = (uint16_t *)(&(stateDelayConfigureStd[1])); } else if ((add >= ENGINE_CONFIGURE_ADD) && (add < GEN_CONFIGURE_ADD)) { addTemp = add - ENGINE_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&engineConfigure); addStdMinp = (uint16_t *)(&(engineConfigureStd[0])); addStdMaxp = (uint16_t *)(&(engineConfigureStd[1])); } else if ((add >= GEN_CONFIGURE_ADD) && (add < LOAD_CONFIGURE_ADD)) { addTemp = add - GEN_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&genConfigure); addStdMinp = (uint16_t *)(&(genConfigureStd[0])); addStdMaxp = (uint16_t *)(&(genConfigureStd[1])); } else if ((add >= LOAD_CONFIGURE_ADD) && (add < ATS_CONFIGURE_ADD)) { addTemp = add - LOAD_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&loadConfigure); addStdMinp = (uint16_t *)(&(loadConfigureStd[0])); addStdMaxp = (uint16_t *)(&(loadConfigureStd[1])); } else if ((add >= ATS_CONFIGURE_ADD) && (add < MODEL_CONFIGURE_ADD)) { addTemp = add - ATS_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&atsConfigure); addStdMinp = (uint16_t *)(&(atsConfigureStd[0])); addStdMaxp = (uint16_t *)(&(atsConfigureStd[1])); } else if ((add >= MODEL_CONFIGURE_ADD) && (add < GSM_CONFIGURE_ADD)) { addTemp = add - MODEL_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&moduleConfigure); addStdMinp = (uint16_t *)(&(moduleConfigureStd[0])); addStdMaxp = (uint16_t *)(&(moduleConfigureStd[1])); } else if ((add >= GSM_CONFIGURE_ADD) && (add < MAINTAIN_CONFIGURE_ADD)) { Spi_write_uint16_t(&val, add, 1); return; } else if ((add >= MAINTAIN_CONFIGURE_ADD) && (add < SENSOR_CONFIGURE_ADD)) { addTemp = add - MAINTAIN_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&maintainConfigure); addStdMinp = (uint16_t *)(&(maintainConfigureStd[0])); addStdMaxp = (uint16_t *)(&(maintainConfigureStd[1])); } else if ((add >= SENSOR_CONFIGURE_ADD) && (add < INPUT_CONFIGURE_ADD)) { addTemp = add - SENSOR_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&sensorConfigure); addStdMinp = (uint16_t *)(&(sensorConfigureStd[0])); addStdMaxp = (uint16_t *)(&(sensorConfigureStd[1])); } else if ((add >= INPUT_CONFIGURE_ADD) && (add < OUTPUT_CONFIGURE_ADD)) { addTemp = add - INPUT_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&inputConfigure); addStdMinp = (uint16_t *)(&(inputConfigureStd[0])); addStdMaxp = (uint16_t *)(&(inputConfigureStd[1])); } else if ((add >= OUTPUT_CONFIGURE_ADD) && (add < ALT_CONFIG_CONFIGURE_ADD1)) { addTemp = add - OUTPUT_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&outputConfigure); addStdMinp = (uint16_t *)(&(outputConfigureStd[0])); addStdMaxp = (uint16_t *)(&(outputConfigureStd[1])); } else if ((add >= ALT_CONFIG_CONFIGURE_ADD1) && (add < ALT_CONFIG_CONFIGURE_ADD2)) { addTemp = add - ALT_CONFIG_CONFIGURE_ADD1; addTemp = addTemp / 2; addp = (uint16_t *)(&selectConfig1); addStdMinp = (uint16_t *)(&(selectConfigureStd[0])); addStdMaxp = (uint16_t *)(&(selectConfigureStd[1])); } else if ((add >= ALT_CONFIG_CONFIGURE_ADD2) && (add < ALT_CONFIG_CONFIGURE_ADD3)) { addTemp = add - ALT_CONFIG_CONFIGURE_ADD2; addTemp = addTemp / 2; addp = (uint16_t *)(&selectConfig2); addStdMinp = (uint16_t *)(&(selectConfigureStd[0])); addStdMaxp = (uint16_t *)(&(selectConfigureStd[1])); } else if ((add >= ALT_CONFIG_CONFIGURE_ADD3) && (add < SYNC_CONFIGURE_ADD)) { addTemp = add - ALT_CONFIG_CONFIGURE_ADD3; addTemp = addTemp / 2; addp = (uint16_t *)(&selectConfig3); addStdMinp = (uint16_t *)(&(selectConfigureStd[0])); addStdMaxp = (uint16_t *)(&(selectConfigureStd[1])); } else if ((add >= SYNC_CONFIGURE_ADD) && (add < GW_CONFIGURE_ADD)) { addTemp = add - SYNC_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&syncConfigure); addStdMinp = (uint16_t *)(&(syncConfigureStd[0])); addStdMaxp = (uint16_t *)(&(syncConfigureStd[1])); } else if ((add >= GW_CONFIGURE_ADD) && (add < EXP_INPUT_CONFIGURE_ADD)) { Spi_write_uint16_t(&val, add, 1); return; } else if ((add >= EXP_INPUT_CONFIGURE_ADD) && (add < EXP_OUTPUT_CONFIGURE_ADD)) { addTemp = add - EXP_INPUT_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&expInputConfigure); addStdMinp = (uint16_t *)(&(expInputConfigureStd[0])); addStdMaxp = (uint16_t *)(&(expInputConfigureStd[1])); } else if ((add >= EXP_OUTPUT_CONFIGURE_ADD) && (add < EXP_AIN_CONFIGURE_ADD)) { addTemp = add - EXP_OUTPUT_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&expOutputConfigure); addStdMinp = (uint16_t *)(&(expOutputConfigureStd[0])); addStdMaxp = (uint16_t *)(&(expOutputConfigureStd[1])); } else if ((add >= EXP_AIN_CONFIGURE_ADD) && (add < EXP_AIN8_CONFIGURE_ADD)) { addTemp = add - EXP_AIN_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&expAinConfigure); addStdMinp = (uint16_t *)(&(expAinConfigureStd[0])); addStdMaxp = (uint16_t *)(&(expAinConfigureStd[1])); } else if ((add >= EXP_AIN8_CONFIGURE_ADD) && (add < USER_CORRECT_CONFIGURE_ADD)) { addTemp = add - EXP_AIN8_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&expAin8Configure); addStdMinp = (uint16_t *)(&(expAin8ConfigureStd[0])); addStdMaxp = (uint16_t *)(&(expAin8ConfigureStd[1])); } else if ((add >= USER_CORRECT_CONFIGURE_ADD) && (add < INSIDE_CORRECT_CONFIGURE_ADD)) { addTemp = add - USER_CORRECT_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&userCorrectConfigure); addStdMinp = (uint16_t *)(&(userCorrectConfigureStd[0])); addStdMaxp = (uint16_t *)(&(userCorrectConfigureStd[1])); } else if ((add >= INSIDE_CORRECT_CONFIGURE_ADD) && (add < RECORD_NUM_ADDRESS)) { addTemp = add - INSIDE_CORRECT_CONFIGURE_ADD; addTemp = addTemp / 2; addp = (uint16_t *)(&insideCorrectConfigure); addStdMinp = (uint16_t *)(&(insideCorrectConfigureStd[0])); addStdMaxp = (uint16_t *)(&(insideCorrectConfigureStd[1])); addp += addTemp; addStdMinp += addTemp; addStdMaxp += addTemp; if (((int16_t)val >= (int16_t)(*addStdMinp)) && ((int16_t)val <= (int16_t)(*addStdMaxp))) { Spi_write_uint16_t(&val, add, 1); } else { Spi_read_uint16_t(addp, add, 1); } return; } else { Spi_write_uint16_t(&val, add, 1); return; } addp += addTemp; addStdMinp += addTemp; addStdMaxp += addTemp; U16min = *addStdMinp; U16max = *addStdMaxp; I16min = *addStdMinp; I16max = *addStdMaxp; if (U16max >= U16min) { if ((val >= U16min) && (val <= U16max)) { Spi_write_uint16_t(&val, add, 1); Spi_read_uint16_t(&val, add, 1); } else { Spi_read_uint16_t(addp, add, 1); } } else { if ((((int16_t)val) >= I16min) && (((int16_t)val) <= I16max)) { Spi_write_uint16_t(&val, add, 1); Spi_read_uint16_t(&val, add, 1); } else { Spi_read_uint16_t(addp, add, 1); } } } 功能描述
09-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值