Sql WHERE子句中DECODE()语句的性能优化
我重新编写了一个查询,以减少选择记录所需的时间。但我仍然看到,由于成本很高,需要在解码线路上进行一些小的调整。有人能告诉我是否可以在没有解码功能的情况下重新编写相同的查询吗?删除解码功能的目的是使用Sql WHERE子句中DECODE()语句的性能优化,sql,oracle,performance,query-optimization,Sql,Oracle,Performance,Query Optimization,我重新编写了一个查询,以减少选择记录所需的时间。但我仍然看到,由于成本很高,需要在解码线路上进行一些小的调整。有人能告诉我是否可以在没有解码功能的情况下重新编写相同的查询吗?删除解码功能的目的是使用v_id列中的索引 到目前为止我都试过了 尝试创建函数索引(知道无法使用绑定变量),但失败 已尝试使用或条件,但它不会选择索引。所以任何建议都会有很大帮助 查询如下: SELECT SUM(NVL(dd.amt,0)) FROM db,dd WHERE db.id = dd.dsba_id A
v_id
列中的索引
到目前为止我都试过了
SELECT SUM(NVL(dd.amt,0))
FROM db,dd
WHERE db.id = dd.dsba_id
AND dd.nd_id = xxxxxxx
AND dd.a_id = 'xxxxx-xx'
AND DECODE (db.v_id , xxxxxxxxx, 'COMPLETE' , db.code ) = 'COMPLETE'
AND db.datet BETWEEN TRUNC ( SYSDATE , 'YEAR' ) AND SYSDATE;
我建议将代码编写为:
SELECT SUM(dd.amt)
FROM db JOIN
dd
ON db.id = dd.dsba_id
WHERE dd.nd_id = xxxxxxx AND
dd.a_id = 'xxxxx-xx' AND
(db.v_id = xxxxxxxxx OR db.code = 'COMPLETE') AND
db.datet >= trunc(sysdate, 'YEAR');
对于此查询,我建议使用以下索引:
db(nd\u id,a\u id,id,datet,code)
dd(dsba\u id,datet,v\u id)
- 切勿在
子句中使用逗号。始终使用正确、明确、标准、可读的连接语法。(但是,这不会影响性能。)FROM
很难理解。一个简单的布尔值decode()
是等价的或
- 假定
不在将来,则不需要在datet
之间执行
- 不需要
,因为SUM(NVL())
值被忽略。如果您关心NULL
结果,我建议NULL
COALESCE(SUM(dd.amt),0)
ela t
?我将很快分享解释计划。您的标题中的Reg:是什么意思?关于。抱歉(没有特殊意义)在这种情况下,decode
的重写可能是等效的(例如,如果v_id
列声明为notnull
),但通常不是。如果v_id
和xxxxxxxx
都是null
,decode
条件将返回true
,而不管code
;对于或重写,情况并非如此。这正是一些人在这种情况下更喜欢decode
的原因;正确的重写rite(在所有情况下都是等效的)比您所展示的更复杂。但是,当我将其作为或条件重新编写时,我会得到更高的成本。我尝试了这种方法(在问题中提到)。问题是,当我使用或条件Too时,索引没有被选中。正如我前面所说,您需要发布解释计划。扮鬼脸和猜测是调整查询最不有效的方法:Oracle提供了大量有关查询性能的具体信息,以避免此类对话。@VimalBhaskar…Thedecode()
与或
的比较应该不会对索引的使用产生影响。您是否尝试了此答案中指定的索引?