对于一个很大的数据库表,查询时不能利用索引怎么办?
对于一个很大的数据库表,查询时不能利用索引怎么办?
环境:
Oracle:9.2.0.1 for Windows2003Server
表1:tStkPc
索引:Idx_tStkPc OrgCode\PluID\ExPluCode
记录数:4,412,381
表2:tDstDpsData
记录数:10000
我的脚本如下:
select * from tDstDpsData T
where Exists(select 1 from tStkPc where OrgCode=T.OrgCode and PluID=T.PluID and JsCode='2')
在我们的十几个数据库中,这个语句肯定会利用索引Idx_tStkPc,从而可以保证查询速度比较快。但是另外一个服务器上的数据库中的数据是刚从MSSQL2000转移过来的,在执行这个语句时,就不能使用索引,速度奇慢。
我们在这个基础上,对数据库执行了统计,此时oracle肯定就根据Cost模式得到执行计划。我们仔细看了,oracle认为全表扫描的成本时756,而利用索引的成本是83031。
为了解决这个问题,我们把sStkPc表Drop后重新创建、重新建立索引、重新更新统计信息,但都不管用。
我还尝试了另外一种写法,就是强制指定索引,语句如下,执行效果比较好,但在我的程序中,有太多地方利用表tStkPc了,基本上都是这种用法,要修改就太困难了。
select * from tDstDpsData T
where Exists(select /*+ Index(tStkPc IDX_TSTKPC)*/ 1 from tStkPc where OrgCode=T.OrgCode and PluID=T.PluID and JsCode='2')
各位大侠,谁有好办法解决这个问题呢,高分赠上。