Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database Oracle WHERE子句性能_Database_Oracle - Fatal编程技术网

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
子句:可能是为了简洁起见而忽略了这些。您如何衡量查询所需的时间?直到返回第一行还是直到返回所有行?