現在我建了一個索引,
如果語句where 後面跟一個特定值,那麼就能熱執行索引;
比如這樣寫就能有索引的:
SELECT A.RKD16 RKRQ,
A.BM01 BM,
A.WLDW01 WLDW,
A.RKD19 TJXYH,
A.RKD04 HZFS,
B.SPXX01 SPXX,
SUM(B.RKDI05) RKSL,
sum(B.RKDI07) JHJE
FROM RKDITEM B, RKD A
WHERE
A.RKD16 >= to_date('2004-11-04','yyyy-mm-dd')
AND A.RKD16 <=to_date('2004-11-04','yyyy-mm-dd')
AND B.RKD01 = A.RKD01
group by A.RKD16, A.BM01, A.WLDW01, A.RKD19, A.RKD04, B.SPXX01;但是如果後面跟的是變量,如下面那樣:SELECT A.RKD16 RKRQ,
A.BM01 BM,
A.WLDW01 WLDW,
A.RKD19 TJXYH,
A.RKD04 HZFS,
B.SPXX01 SPXX,
SUM(B.RKDI05) RKSL,
sum(B.RKDI07) JHJE
FROM RKDITEM B, RKD A
WHERE
A.RKD16 >= :mm
AND A.RKD16 <=:mm
AND B.RKD01 = A.RKD01
group by A.RKD16, A.BM01, A.WLDW01, A.RKD19, A.RKD04, B.SPXX01就進行了全盤掃描,為什麼會有這種現角象,請高手告訴我個解決辦法啊。。不勝感激。。
如果語句where 後面跟一個特定值,那麼就能熱執行索引;
比如這樣寫就能有索引的:
SELECT A.RKD16 RKRQ,
A.BM01 BM,
A.WLDW01 WLDW,
A.RKD19 TJXYH,
A.RKD04 HZFS,
B.SPXX01 SPXX,
SUM(B.RKDI05) RKSL,
sum(B.RKDI07) JHJE
FROM RKDITEM B, RKD A
WHERE
A.RKD16 >= to_date('2004-11-04','yyyy-mm-dd')
AND A.RKD16 <=to_date('2004-11-04','yyyy-mm-dd')
AND B.RKD01 = A.RKD01
group by A.RKD16, A.BM01, A.WLDW01, A.RKD19, A.RKD04, B.SPXX01;但是如果後面跟的是變量,如下面那樣:SELECT A.RKD16 RKRQ,
A.BM01 BM,
A.WLDW01 WLDW,
A.RKD19 TJXYH,
A.RKD04 HZFS,
B.SPXX01 SPXX,
SUM(B.RKDI05) RKSL,
sum(B.RKDI07) JHJE
FROM RKDITEM B, RKD A
WHERE
A.RKD16 >= :mm
AND A.RKD16 <=:mm
AND B.RKD01 = A.RKD01
group by A.RKD16, A.BM01, A.WLDW01, A.RKD19, A.RKD04, B.SPXX01就進行了全盤掃描,為什麼會有這種現角象,請高手告訴我個解決辦法啊。。不勝感激。。
针对第一种情况,在建立查询优化树的时侯,oracle知道你要对字段检索,并能计算出给定值检索需要的大约成本;
而第二种情况下,由于在建立计划树的时侯,oracle并不清楚你要输入的变量值是什么,极端点来说你输入的最小值可能比表中最小的值都要小,而最大值比实际最大值还要大,这时如果使用索引进行检索,反而增加了检索开销。
由于oracle无法确认你使用索引的方法能否减少开销,所以他宁愿不使用这个索引,而采用全表扫描的方式执行检索。