首页 > 解决方案 > SQL 查询结构是否会影响其性能?

问题描述

我的问题是理论上的。说出以下查询(选项 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 给出了相同的结果,但是,它似乎在将其缩小到衬衫之前对所有可用的 orderId 执行内部连接。

我对 bc 的最终影响感到好奇,有时存储过程会变得非常大,我想确保它们不会不必要地影响报告加载时间。

标签: sqlsql-servertsql

解决方案


这两个查询在 SQL Server 中应该评估为完全相同的执行计划——相同的性能。这与索引无关。

为什么?SQL 是一种描述性语言。SELECT查询描述结果集。它没有指定如何创建结果集。在大多数数据库中,确定要做什么的工作由 SQL 编译器和优化器处理,它们生成操作的有向无环图 (DAG)(一些数据库还进行运行时优化)。对于新手来说,DAG 中的操作与原来的SELECT.

并非所有数据库都具有像 SQL Server 一样智能的优化器。例如,MySQL 存在差异——尤其是在旧版本中。MySQL 倾向于实现子查询,这通常会对性能产生不利影响。然而,这是由于糟糕的优化策略而不是一般的 SQL。


推荐阅读