sql - 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 的最终影响感到好奇,有时存储过程会变得非常大,我想确保它们不会不必要地影响报告加载时间。
解决方案
这两个查询在 SQL Server 中应该评估为完全相同的执行计划——相同的性能。这与索引无关。
为什么?SQL 是一种描述性语言。SELECT
查询描述结果集。它没有指定如何创建结果集。在大多数数据库中,确定要做什么的工作由 SQL 编译器和优化器处理,它们生成操作的有向无环图 (DAG)(一些数据库还进行运行时优化)。对于新手来说,DAG 中的操作与原来的SELECT
.
并非所有数据库都具有像 SQL Server 一样智能的优化器。例如,MySQL 存在差异——尤其是在旧版本中。MySQL 倾向于实现子查询,这通常会对性能产生不利影响。然而,这是由于糟糕的优化策略而不是一般的 SQL。
推荐阅读
- c++ - 获取 cout 中的最后一个字符
- java - 在流式响应/api 调用中未接收到数据
- javascript - 如何使用 React 从 strava api 下载 gpx 文件
- python - 用 python 抓取 etoro
- flutter - 提供者中的 notifyListeners 不工作导致使用提供者内部的类?
- sas - 在 SAS 宏调用中传递特殊字符(和号、连字符)
- javascript - 无法在 EditableGeoJsonLayer.updateState 处读取未定义的属性“highlightedObjectIndex”
- excel - 根据计算的单元格值更新形状的颜色
- php - 需要 Wordpress 评论作者
- python - LinkedList 的错误实现