sql - 分页结果集中的选择子查询和左外连接哪个更快

标签 sql sql-server performance

使用 MSSQL 查询时,从计算表中获取单个列并将其连接到结果集的最有效方法是什么。

表:mytable = mytable.col1 上有 20k 行索引,othertable = 30k 行,othertable.col1 上没有索引

内联查询 - 在 select 语句中运行查询

SELECT * FROM (
    SELECT col1, col2, col3, 
    col4 = (SELECT min(col5) FROM othertable o WHERE m.col1 = o.col1)
    row = ROW_NUMBER() OVER(ORDER BY somerow) 
    FROM mytable m
) as paged
WHERE row BETWEEN 1 AND 25

连接查询 - 将我们的表连接到计算表

SELECT * FROM (
    SELECT col1, col2, col3, o2.col5again
    row = ROW_NUMBER() OVER(ORDER BY somerow) 
    FROM mytable m
    JOIN (SELECT col1, min(col5) as col5again FROM othertable o GROUP BY col1) as o2 ON o2.col1 = m.col1
) as paged
WHERE row BETWEEN 1 AND 25

我的直觉是 JOIN 更快。然而,经测试,内联查询平均将在 7 秒内完成,而在 MSSQL studio 中执行时,另一个查询将花费超过 30 秒的时间。

  1. 使用内联选择查询真的是注入(inject)单列的最佳方式吗?
  2. 优化的查询是否会等到结果分页后才运行内联 SELECT() 语句,这是否可以解释运行时间的不同?

仅供引用:在我的具体示例中,我们向 othertable.col1 添加了索引,并将查询时间减少到 0 秒,但这个问题更多地关注 JOIN 与 SELECT() 是否更好。

最佳答案

性能调整是一门艺术,涉及理解为什么要这样创建计划、计划中的每个部分的作用以及如何影响更有效的路径选择。

缺少覆盖索引会导致扫描(过度读取)。太多索引会减慢您的 DUI(删除、更新和插入)速度。过时或丢失的统计信息将导致使用错误的连接算法和/或不准确的估计行数(这可能导致分页)。

在同一窗口中运行两个查询并包含实际的执行计划。这会将计划分开并告诉您哪一个更贵。它会给你缺少的索引提示。随着您更好地阅读计划,您将了解如何提高查询性能。

关于sql - 分页结果集中的选择子查询和左外连接哪个更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8059282/

相关文章:

performance - F# 代码引用调用、性能和运行时要求

sql - oracle sql 缺少右括号

mysql - 如何在MySQL中使用合并功能?

sql-server - PM scaffold-dbcontext 未创建主键

php - 如何让基于 curl 的 URL 监控服务轻量级运行?

performance - 为什么 PostgresQL 查询性能随时间下降,但在重建索引时恢复

mysql - SQL 查询比较不同表和数据库中的列

mysql - 简单连接与 Where 子句

sql - 在特定单词后返回 SUBSTRING 并在第一个引号处结束

sql - 使用 SSIS 导入/导出向导在数字列中保留 NULL?