Database Oracle WHERE子句性能
我有一个类似的声明Database Oracle WHERE子句性能,database,oracle,Database,Oracle,我有一个类似的声明 SELECT tableA A, tableB B, tableC C WHERE a.ID = b.ID and C.level = '2' 如果我表演 SELECT tableA A, tableB B, tableC C WHERE a.ID = b.ID and 我的结果在33秒内返回。如果执行原始查询,结果将在150秒内返回。为什么C.level='2'会让它变慢?如果你看看Oracle的执行计划,你就会看到它在幕后做什么。然而,总而言之,我猜你的逻辑是:
SELECT tableA A, tableB B, tableC C
WHERE a.ID = b.ID and
C.level = '2'
如果我表演
SELECT tableA A, tableB B, tableC C
WHERE a.ID = b.ID and
我的结果在33秒内返回。如果执行原始查询,结果将在150秒内返回。为什么
C.level='2'
会让它变慢?如果你看看Oracle的执行计划,你就会看到它在幕后做什么。然而,总而言之,我猜你的逻辑是:
通过添加C.level='2'
,我们应该得到一个更小的数据集,因此返回速度应该更快
但是,对于数据库引擎,它现在必须遍历数据并检查每个记录,以查看它是否符合您更复杂的条件。它如何做到这一点取决于您的模式。例如,如果您在
c.level
上有一个索引,这可能会使性能差异变得微不足道。假设不能进行索引,有没有办法重新构造查询以更快地执行?您的查询非常简单,几乎没有什么可以做的:这是否会使它更快,这不重要。为什么不能创建索引?您的语句没有正确地联接所有三个表。您至少缺少一个联接条件。您应该习惯使用显式的JOIN
,而不是在where子句中进行连接。它还缺少from
子句:可能是为了简洁起见而忽略了这些。您如何衡量查询所需的时间?直到返回第一行还是直到返回所有行?