首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NVL函数不使用索引而不是FTS,是否可以修改查询

NVL函数不使用索引而不是FTS,是否可以修改查询
EN

Stack Overflow用户
提问于 2020-07-02 02:05:52
回答 2查看 319关注 0票数 0

我的查询如下

代码语言:javascript
运行
复制
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函数位于三个不同表的列上,我无法基于函数爬取基于索引的索引,任何其他重写查询的方式或任何其他我可以在此处使用索引的方式,请帮助

EN

回答 2

Stack Overflow用户

发布于 2020-07-02 02:16:42

您可以按如下方式使用coalesce函数:

代码语言:javascript
运行
复制
Coalesce(a.value1, b.value1, c.value1)

或者,您可以按如下方式使用case when语句:

代码语言:javascript
运行
复制
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使用短路评估,这意味着它只在需要参数时才评估参数。

票数 0
EN

Stack Overflow用户

发布于 2020-07-07 09:37:16

在没有看到执行计划的情况下,不可能对查询做出明确的评论。我认为您不能同时在多个表上创建基于函数的索引。老实说,我怀疑NVL是一个瓶颈。您可能要做的是创建三个索引:

代码语言:javascript
运行
复制
create index idx1 on table1( value2, value1 );
create index idx2 on table2( value3, value2, value1 );
create index idx3 on table3( value3, value1 );

至少到那时,Oracle将不必获取每个表的完整行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62682851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档