【发布时间】:2021-04-11 06:51:47
【问题描述】:
我重新编写了一个查询以减少选择记录所需的时间。但是我仍然看到,由于成本很高,因此需要在解码线中进行一些小调整。有人可以告诉我是否可以在没有解码功能的情况下重写相同的查询吗?删除解码函数的目的是使用v_id 列中的索引。
到目前为止我已经尝试过什么。
- 尝试创建函数索引(知道无法使用绑定变量),但失败了。
- 已尝试使用 OR 条件,但它不会选择索引。所以任何建议都会有很大帮助。
查询如下:
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;
【问题讨论】:
-
优化器似乎不太可能选择使用基于函数的索引。我希望该查询能够驱动表 DD,因为您对 ND_ID 和 A_ID 具有相等访问权限,然后它可能会选择使用索引来加入 ID 上的 DB。但其他标准看起来好像总是过滤器。
-
不管怎样,这里没有足够的信息让任何人只能猜测,这浪费了我们所有的时间(包括你的)。我建议您阅读this excellent post on asking Oracle tuning questions,并可能编辑您的问题以提供更多详细信息。不过,我也建议你考虑一下是否真的有“需要做的小调整”。您希望减少查询的已用时间多少时间?它真的需要进一步调整吗?还是您的用户可以使用当前的
ela t? -
我会尽快分享解释计划。
-
你的标题中的 Reg: 是什么意思?
-
关于。对不起(没有特殊含义)
标签: sql oracle performance query-optimization