select * from ipinfo where startip < ip and endip > ip建组合索引 (startip,endip)后,查询走索引且 cost cardinality bytes 都正常但 执行 dbms_stats后 
exec dbms_stats.gather_table_stats(ownname => 'user',tabname => 'ipinfo',method_opt => 'for all indexed columns',cascade => true);非但不走索引, cardinality bytes 都 异常的大求原因 和 恢复方法 谢谢!

解决方案 »

  1.   

    exec dbms_stats.gather_table_stats(ownname => 'user',tabname => 'ipinfo',cascade => true); 
      

  2.   

    cardinality 非常大,说明符合条件的结果集非常大,所以,用全表检索更划算
      

  3.   

    把没有stats时的执行计划、有stats后的执行计划贴出来。
    在有stats的状态下,用hint指定走index的执行计划也贴出来。
      

  4.   

    太感谢了,确实 走了索引以后 时间更长了,但为什么删掉 统计信息后 执行计划的 3个指标会变小那么多呢? 
    但执行时间仍然很长.......无stats计划 
    SELECT STATEMENT, GOAL = ALL_ROWS    Cost=4 Cardinality=2 Bytes=214
      TABLE ACCESS BY INDEX ROWID Cost=4 Cardinality=2 Bytes=214
      INDEX RANGE SCAN   Cost=3 Cardinality=1 有stats计划
    SELECT STATEMENT, GOAL = ALL_ROWS  Cost=44 Cardinality=7242 Bytes=202776
     TABLE ACCESS FULL  Cost=44 Cardinality=7242 Bytes=202776
    执行时间大约 有stats比无stats 快 3倍
      

  5.   

    lz,SQL中的startip,ip,endip都是列名?
      

  6.   

    删除统计信息后,你强行指定用CBO的话,oracle就开始乱估算了,你想想,基础数据都没了,算出来的东西还能准确吗?
      

  7.   


    原来如此...
    请问 如果我确定 此 SQL语句 必定只返回一条记录(即 startip 跟 endip 都可以加 唯一索引)请问 这句SQL 能 优化吗? 存储过程大部分时间都耗在这句上面了......
      

  8.   

    只要你的where条件查出来的数据是唯一的,那么oracle就会自动帮你用唯一索引的你泊条件中,使用了>和<这种符号,那么检索结果是唯一的可能性是很小的,oracle也只能这样了你的语句中你为什么要select *呢?你只把你需要的字段选出来就可以了啊为了加快速度,你可以把要seelect来的字段也放到索引里去,做成一个复合索引,这样,速度会快很多