【问题标题】:Query Performance on case expression案例表达式的查询性能
【发布时间】:2019-12-03 19:13:53
【问题描述】:

我有一个显示类型的表格(未显示所有列)。 typeid就是PK。有一些不应该存在的日期重叠。我想从我的查询中删除这些。

Custid    typeid      start_dt     end_dt
 101        352       3/28/2017    1/16/2019
 101        353       1/15/2018    1/15/2019    

数据显示如下(重叠示例)。

Custid    typeid      start_dt     end_dt     overlap
 101        352       3/28/2017    1/16/2019    1
 101        353       1/15/2018    1/15/2019    1
 201        426       1/1/2019     12/31/9999   0

SQL。 (索引在所有上述表格列上)

select *
from (select
      Custid, 
      typeid,
      start_dt,
      case
      when end_dt   > lead (start_dt) over (partition by custid order by start_dt) then 1
      when start_dt < lag (end_dt) over (partition by custid order by start_dt)    then 1
      else 0
      end overlap)
   where overlap = 0

对 case 表达式的过滤会减慢查询返回结果的速度。有没有提高查询性能的提示/技巧?

【问题讨论】:

  • 我不确定如何解释“索引在所有上述表格列上”。是否有一个索引涵盖所有列?或者每个单独的列都有一个单独的索引?还是别的什么?
  • @DaveCosta 为每列单独索引

标签: oracle indexing case where-clause query-hints


【解决方案1】:

如果您可以显示执行计划以及现有索引的更多细节,这可能会有所帮助。

我的直接想法是(custid, start_dt) 上的索引可能会避免需要排序来实现窗口逻辑。

【讨论】:

    猜你喜欢
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2010-10-20
    • 2020-05-23
    相关资源
    最近更新 更多