创建外部引用时数据库系统处理多少行
How many rows does the DB System process when you create external references
假设我有以下表格:t1(20 行)、t2(5)、t3(80)、t4(20)和 t5(10)
Select a+b from t1, t2
where a=b
and c in
(
select d from t3, t4, t5
where d=e and f=g and h>10 and t1.a = d
);
如您所见,我们有多个过滤器和产品以及一个外部参考。
过滤前父查询会被处理100(20*5)
次,子查询会被处理16000(20*80*10)
次,因为它有一个外部引用,父查询的每一行都会被处理一次,所以它将被处理 1.600.000
次。
问题是,整个查询是否被处理 1.600.000
次或 1.600.000+100
次(加上父进程)。
如果您想知道,这是关于 class 中提出的一个模棱两可的问题,该问题在考试前没有得到正确回答。
我不确定答案是什么,但它比单个数字复杂得多。这个问题有两个不正确的前提:Oracle 不一定按照写入的顺序执行查询,并且几乎可以肯定连接的算法复杂度不会达到 O(M * N)
.
查询执行顺序
根据给定的信息,无法判断 Oracle 将如何 运行 该查询。 Oracle,可能还有大多数其他数据库,不必 运行 语句按编写顺序排列。
Oracle 优化会频繁地将查询转换为 运行 它更有效。通过视图合并,Oracle 可能会将查询扁平化为一堆常规连接,并且 运行 它们无序。或者 Oracle 可以通过连接消除从执行中完全删除一些表。
生成解释计划以查看查询如何 运行ning。
复杂性
有关连接复杂性分析的示例,请参阅 this question。我们不确切知道 Oracle 的算法是如何工作的,我也不是算法专家,但我认为可以肯定地说数据库很少会处理 O(M * N)
行以进行连接。
可能它使用索引嵌套循环,O(N * log(M))
,或者散列连接,O(N + M)
,或者排序合并,O(N*log(N) + M*log(M))
,或者使用 [=39 的排序合并=]全索引扫描,O(N*log(N) + M)
,等等
那些时间复杂度可能遗漏了很多重要的细节。例如,如果是散列连接,是否需要多次通过?在实践中,single-block IO 与 multiple-block IO 之类的事情可能变得比复杂性更重要。
新方法
您应该通过使用 real-life Oracle 执行计划更务实地解决这个问题,或者从理论上讲,使用算法时间复杂度。不要指望得到一个只有一个方便数字的答案。
假设我有以下表格:t1(20 行)、t2(5)、t3(80)、t4(20)和 t5(10)
Select a+b from t1, t2
where a=b
and c in
(
select d from t3, t4, t5
where d=e and f=g and h>10 and t1.a = d
);
如您所见,我们有多个过滤器和产品以及一个外部参考。
过滤前父查询会被处理100(20*5)
次,子查询会被处理16000(20*80*10)
次,因为它有一个外部引用,父查询的每一行都会被处理一次,所以它将被处理 1.600.000
次。
问题是,整个查询是否被处理 1.600.000
次或 1.600.000+100
次(加上父进程)。
如果您想知道,这是关于 class 中提出的一个模棱两可的问题,该问题在考试前没有得到正确回答。
我不确定答案是什么,但它比单个数字复杂得多。这个问题有两个不正确的前提:Oracle 不一定按照写入的顺序执行查询,并且几乎可以肯定连接的算法复杂度不会达到 O(M * N)
.
查询执行顺序
根据给定的信息,无法判断 Oracle 将如何 运行 该查询。 Oracle,可能还有大多数其他数据库,不必 运行 语句按编写顺序排列。
Oracle 优化会频繁地将查询转换为 运行 它更有效。通过视图合并,Oracle 可能会将查询扁平化为一堆常规连接,并且 运行 它们无序。或者 Oracle 可以通过连接消除从执行中完全删除一些表。
生成解释计划以查看查询如何 运行ning。
复杂性
有关连接复杂性分析的示例,请参阅 this question。我们不确切知道 Oracle 的算法是如何工作的,我也不是算法专家,但我认为可以肯定地说数据库很少会处理 O(M * N)
行以进行连接。
可能它使用索引嵌套循环,O(N * log(M))
,或者散列连接,O(N + M)
,或者排序合并,O(N*log(N) + M*log(M))
,或者使用 [=39 的排序合并=]全索引扫描,O(N*log(N) + M)
,等等
那些时间复杂度可能遗漏了很多重要的细节。例如,如果是散列连接,是否需要多次通过?在实践中,single-block IO 与 multiple-block IO 之类的事情可能变得比复杂性更重要。
新方法
您应该通过使用 real-life Oracle 执行计划更务实地解决这个问题,或者从理论上讲,使用算法时间复杂度。不要指望得到一个只有一个方便数字的答案。