我的查询如下
select nvl(a.value1,nvl(b.value1,nvl(c.value1,''))
from table1 a, table2 b table3 c
where a.value2=b.value2 and b.value3=c.value3
由于此查询包含一个nvl函数,它会对我的三个表中的value1进行全表扫描,我知道如果我可以创建一个基于函数的索引,oracle应该考虑该索引,但我担心的是,由于nvl函数位于三个不同表的列上,我无法基于函数爬取基于索引的索引,任何其他重写查询的方式或任何其他我可以在此处使用索引的方式,请帮助
发布于 2020-07-02 02:16:42
您可以按如下方式使用coalesce
函数:
Coalesce(a.value1, b.value1, c.value1)
或者,您可以按如下方式使用case when
语句:
Case when a.value1 is not null then a.valie1
When b.value1 is not null then b.value1
Else c.value1
End
注意:coalesce
的性能比NVL
更好,因为coleasce
使用短路评估,这意味着它只在需要参数时才评估参数。
发布于 2020-07-07 09:37:16
在没有看到执行计划的情况下,不可能对查询做出明确的评论。我认为您不能同时在多个表上创建基于函数的索引。老实说,我怀疑NVL是一个瓶颈。您可能要做的是创建三个索引:
create index idx1 on table1( value2, value1 );
create index idx2 on table2( value3, value2, value1 );
create index idx3 on table3( value3, value1 );
至少到那时,Oracle将不必获取每个表的完整行。
https://stackoverflow.com/questions/62682851
复制相似问题