在oracle 8.1.7中建立全文索引,数据量不到10万条,而索引的数据量已大于500万条,以致于查询速度很慢,一般要10几秒,查询SQL如下:select /* + FIRST_ROWS */ * from(
SELECT IID 
FROM IP_Info 
where contains(ctcontent,'伊拉克',1)>0 
ORDER BY IID desc
)
where rownum<20其中iid是主键,由sequence产生。相当于按记录插入时间倒序排序。测试发现:主要是order by后花的时间,如果去掉order by ,则速度将提高数十倍。且经SQL 分析发现,在order by 时,没有使用到IID上的索引。也就是说,没有用到[stopkey]的优化措施,实际上是取出所有的记录后再排序的,并非取前20条记录。此表中的数据极有规律,始终需要后插入的数据最先显示,是否有可能将此SQL优化?

解决方案 »

  1.   

    无人会吗?看来我要弃Oracle而使用SQLServer了,在SQL Server中建了DESC索引后,使用Top 5后,IID最大的自动最先出来,并且速度也很快。唉
      

  2.   

    参考一下。
    http://www.itpub.net/showthread.php?s=&threadid=25259&highlight=%B5%B9%D0%F2%CB%F7%D2%FD
      

  3.   

    to jiezhi(西域浪子) 这是OCP DBA的教材,我以前看过。但不知道对我有什么帮助。请您详细指点一下。
    Thanks.
      

  4.   

    第一种方法:试一下重建索引(最好在系统比较空闲的时候做)
    alter index index_name rebuild online;
    观察性能是否有提高第二种方法:建立函数索引
    create index index_func_name on (ctcontent,'伊拉克',1);
      

  5.   

    to zzok1() 
    不是索引的问题,ctcontent是clob字段,在此字段上建有全文索引。慢的主要原因是是含有‘伊拉克’的数据有一万多条,再排序比较慢,如果有可能在 ctcontent和IID上建联合索引,则oracle有可能用到[stopkey]的优化措施,而全文索引和其他字段的索引似乎是不能联在一起的。实际上,按where条件搜寻出来的记录已经是排好序的,我只需要倒着按IID取就行了,为什么需要再次order by呢?另外:
    create index index_func_name on (ctcontent,'伊拉克',1);
    我不明白是什么意思,如何建?‘伊拉克’只是一个搜索关键字。