我知道这是一个常见问题,我已经阅读了其他几篇文章和论文,但是我找不到一个考虑索引字段和两个查询都可能返回的记录数量的问题。嵌套选择的性能
我的问题确实很简单。在这里推荐使用类似于SQL的语法(在性能方面)编写这两者中的哪一个。
首先查询:
Select *
from someTable s
where s.someTable_id in
(Select someTable_id
from otherTable o
where o.indexedField = 123)
第二个查询:
Select *
from someTable
where someTable_id in
(Select someTable_id
from otherTable o
where o.someIndexedField = s.someIndexedField
and o.anotherIndexedField = 123)
我的理解是,第二个查询将在数据库中查询每一个元组外查询将返回在第一个查询将评估先选择内部,然后将过滤器应用于外部查询。
现在,第二个查询可能会查询数据库超快,考虑到someIndexedField字段已编入索引,但说我们有成千上万或数百万记录不会更快使用第一个查询吗?
注意:在Oracle数据库中。
。 。一般来说,没有指定数据库的性能问题是毫无意义的。 SQL是一种描述性语言,而不是过程语言,所以优化器(引擎的一部分)可以自由选择任何查询计划对于给定查询的最佳选择。 –
@GordonLinoff好点。该数据库是一个Oracle数据库。这个语言应该不是很重要,我想只是用SQL语法来编写它。 – mixkat
。 。根据Tom Kyte的说法,Oracle优化器足够智能,可以识别相关的子查询并将它们转换为适当的连接(http://asktom.oracle.com/pls/apex/f?p=100:11:0::NO :: P11_QUESTION_ID:3167884300346662300)。 Oracle有一个非常好的优化器。有趣的是,第一个版本在MySQL中性能完全可观。 。 。直到解决问题的版本5.6。 –