当我将通常为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前端),所以我无法得到解释计划。我的好奇心并不是服务请求让供应商解释的合适理由。
答案 0 :(得分:1)
评论太长了。
毫无疑问,性能上的差异是由于使用索引与全表扫描。 Oracle通常有一个很好的优化器,所以它会错过这样一个优化机会,这是令人惊讶的。
仅使用一个表的查询超过30分钟是一个非常长的时间。这表明你的表有数十亿行,而你的计算机速度很慢。桌子有多大?你的处理器有多慢?
另一种可能性是服务器上正在进行其他操作,例如检查点或桌面上的数据修改。