我的问题是理论上的。说下面的查询(选项A)。
Select *
from orders o
inner join (
select *
from orderDetails
where product = 'shirt'
) od on o.orderId = od.orderId
对比以下(选项B)
Select *
from orders o
inner join orderDetails od on o.orderId = od.orderId
where od.product = 'shirt'
这两种方法在技术上有什么优势吗?例如,我觉得选项A对数据库的资源要求较低,因为内部连接发生在已经缩小的行数上。而选项B给出了同样的结果,但是,它似乎是在所有可用的订单信息上执行内部连接,然后再将其缩小到衬衫上。
我很好奇最终的影响,因为有时存储过程会变得相当大,我想确保它们不会不必要地影响报表加载时间。
这两个查询在SQL Server中应该评估到完全相同的执行计划--同样的性能。 这与索引无关。
为什么这么说呢? SQL是一个 描述性 语。 A SELECT
疑问 描述 的结果集。 它没有指定结果集是如何创建的。 在大多数数据库中,弄清做什么的工作由SQL编译器和优化器来处理,它们会产生一个定向-环形图(DAG)的操作(有些数据库也会进行运行时优化)。 对于新手来说,DAG中的操作看起来和原来的完全不同 SELECT
.
并不是所有的数据库都有像SQL Server一样聪明的优化器。 例如,在MySQL中存在着差异 -- -- 特别是在旧版本中。 MySQL有一种将子查询具体化的倾向,这通常会对性能产生不利影响。 然而,这是由于不良的优化策略,而不是由于一般的SQL。