为什么CASE表达式比WHERE子句更有效?

时间:2015-11-13 12:16:57

标签: sql oracle case where-clause

当我将通常为WHERE子句的内容放入CASE表达式时,有人可以建议为什么我对具有数亿行的表的特定查询更有效吗?

逻辑上你这样做:

SELECT
  NOTES_TABLE.CASE_ID,
  NOTES_TABLE.CASE_NOTE,
  NOTES_TABLE.ACTIVITY_NAME,
  NOTES_TABLE.CREATED_DATETIME
FROM
  NOTES_TABLE
WHERE
  NOTES_TABLE.ACTIVITY_NAME  =  'Some Activity'
  AND NOTES_TABLE.CREATED_DATETIME > '01 Jan 2015 00:00:00'
  AND NOTES_TABLE.CASE_NOTE='Some Activity has been processed'

但是,我注意到了:

select t1.* FROM 
(
  SELECT
    NOTES_TABLE.CASE_ID,
    case 
      when NOTES_TABLE.CASE_NOTE='Some Activity has been processed' 
      then NOTES_TABLE.CASE_NOTE else null 
    end as NOTES_TABLEs,
    NOTES_TABLE.ACTIVITY_NAME,
    NOTES_TABLE.CREATED_DATETIME
  FROM
    NOTES_TABLE
  WHERE
    NOTES_TABLE.ACTIVITY_NAME  =  'Some Activity'
    AND NOTES_TABLE.CREATED_DATETIME > '01 Jan 2015 00:00:00'
) t1 
WHERE t1.NOTES_TABLEs is not null 

在几秒钟而不是30多分钟内运行。

这个问题已经让我感到困扰了一段时间,但不幸的是我没有直接的数据库访问权限(使用Infoview前端),所以我无法得到解释计划。我的好奇心并不是服务请求让供应商解释的合适理由。

1 个答案:

答案 0 :(得分:1)

评论太长了。

毫无疑问,性能上的差异是由于使用索引与全表扫描。 Oracle通常有一个很好的优化器,所以它会错过这样一个优化机会,这是令人惊讶的。

仅使用一个表的查询超过30分钟是一个非常长的时间。这表明你的表有数十亿行,而你的计算机速度很慢。桌子有多大?你的处理器有多慢?

另一种可能性是服务器上正在进行其他操作,例如检查点或桌面上的数据修改。