已经为BILLID创建了索引,但查询时却没用上?
是不是我看错了?

解决方案 »

  1.   

    按理说应该是走索引的:
    SELECT STATEMENT, GOAL = ALL_ROWS 2 1 25
     TABLE ACCESS BY INDEX ROWID APPS SYSUSER 2 1 25
      INDEX RANGE SCAN APPS SYSUSER_I 1 1 其中,SYSUSER_I就是我仿照你的方法,在ID上建的索引。
    很明显是INDEX RANGE SCAN啊。你的表里数据量大不大?
    字段BILLID的值的分布,有没有什么特点?比如说:哪个区间内的值比较多
      

  2.   

    我知道了。当前我的测试用表是sysuser,有一个account_id字段,以account_id建立索引“sysuser_i”,表中数据分布如下:
    表中共10004条数据,其中,account_id=1的数据有9991条,account_id=2的数据有1条。
    我执行下面两个查询,执行计划是不同的:
    1.select * from sysuser where account_id = 1; --9991条,表中大部分数据
    全表扫描,TABLE ACCESS FULL
    因为表中绝大部分数据都是account_id = 1的,所以使用索引更慢。即使你建立了索引,10g的ORACLE也会智能地选用全表扫描。
    2.select * from sysuser where account_id = 2; --只有1条,
    INDEX RANGE SCAN   SYSUSER_I
    选用索引方式。
      

  3.   

    这个表记录是:19万行
    我用mssql的执行计划 是走索引的。怎么在oracle就不走索引(oracle不熟啊)楼上说的:"字段BILLID的值的分布,有没有什么特点?比如说:哪个区间内的值比较多"
    这些我没搞过,应该是默认的
      

  4.   

    哦,我知道你的意思了,数据分布问题:表中数据很散乱的,19万条记录
    select billid,count(*) as x from iesk_stocktransitem group by billid having count(*)>10 order by x desc
    大于100条记录的只有4个billid。理论是走索引的
      

  5.   

    我晕了,是不是oracle的索引要过一段时间才生效? 现在好像用上索引了
    我不怎么会看oracle的执行计划 ,楼上的“兰兰”大侠能不能帮我解释下(按这个图片给解释下)?
      

  6.   

    你的ORACLE是啥么版本的?怎么生效这么慢
    啊~~~~~~我知道了你的数据量太大了。
    ORACLE在你建好索引之后,需要按你建的索引,先把数据重排一下。。搜索一下信息
    这个截图说明,用到了索引IESK_STOCKTRANSITEM_BILLID..
      

  7.   

    图片中我有几点不明白:
    1.访问谓词 和 过滤谓词 是什么东西?有什么区别(mssql好像没这东西)
    2.OPTIONS中的 "by Index RowId" 与"RANGE SCAN" 说明用了什么东西?
    3.COST是什么成本?
      

  8.   

    1.访问谓词 和 过滤谓词 是什么东西?有什么区别(mssql好像没这东西)
    一般叫Access(访问)和Filter(过滤)。
    Access表示,这个条件的值会影响ORACLE数据的访问路径,是按表内容访问,还是按索引内容访问;
    Filter表示,条件的值不影响ORACLE数据的访问路径,只起过滤作用;
    2.OPTIONS中的 "by Index RowId" 与"RANGE SCAN" 说明用了什么东西?
    看执行计划时,先从缩进最多的那条开始看,就是从INDEX RANGE SCAN这条开始,说明当前的查询使用了索引扫描范围(这个按字面理解就行),即使用一个索引存取多行数据;
    3.COST是什么成本?
    这个我也不知道,呵呵,只知道一般都是越小越好。。
      

  9.   

    嗯,很清楚,谢谢兰兰!另外再问下(有点贪心),oracle的IO及执行点用CPU时间命令或参数是什么?显示有关由SQL 语句生成的磁盘活动量的信息
    MSSQL对应的是 SET STATISTICS IO ON显示有关由SQL 语句占用CPU时间信息
    MSSQL对应的是 SET STATISTICS TIME ON
      

  10.   

    这个命令我还真不知道。
    我只知道可以在LINUX或者UNIX环境下,查看CPU和IO占用情况。至于你说的参数设置,我没有用过。。不好意思喽~~~