現在我建了一個索引,
如果語句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就進行了全盤掃描,為什麼會有這種現角象,請高手告訴我個解決辦法啊。。不勝感激。。
解决方案 »
- 新手提问,关于oracle10g 启动lsnctrl start错误
- 请教IMP的几个参数详细用法
- 高分求解。。触发器※※变量问题。。。如何在触发器向日志写入值时,能够从变量读取到表某字段名从而获得该字段的旧值和新值
- 怎样才能简化这条PLSQL语句?
- 在PL/SQL中,怎样判断一次查询的结果是否为空?
- 一个数据库安装的问题
- 急!请指教该SQL如何写?
- sql like 相关信息
- 如何在Oracle数据库写存储过程访问MySql数据库
- Oracle11g表已经存在数据了,有一个dmp文件想重新覆盖原有的数据,同时添加新的数据,该怎么做
- 请教一个存储过程的写法
- 這個過程怎麼優化才好了?為什麼執行這麼慢!高手請進來看看
针对第一种情况,在建立查询优化树的时侯,oracle知道你要对字段检索,并能计算出给定值检索需要的大约成本;
而第二种情况下,由于在建立计划树的时侯,oracle并不清楚你要输入的变量值是什么,极端点来说你输入的最小值可能比表中最小的值都要小,而最大值比实际最大值还要大,这时如果使用索引进行检索,反而增加了检索开销。
由于oracle无法确认你使用索引的方法能否减少开销,所以他宁愿不使用这个索引,而采用全表扫描的方式执行检索。