使用 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 秒的时间。
- 使用内联选择查询真的是注入(inject)单列的最佳方式吗?
- 优化的查询是否会等到结果分页后才运行内联
SELECT()
语句,这是否可以解释运行时间的不同?
仅供引用:在我的具体示例中,我们向 othertable.col1
添加了索引,并将查询时间减少到 0 秒,但这个问题更多地关注 JOIN 与 SELECT() 是否更好。
最佳答案
性能调整是一门艺术,涉及理解为什么要这样创建计划、计划中的每个部分的作用以及如何影响更有效的路径选择。
缺少覆盖索引会导致扫描(过度读取)。太多索引会减慢您的 DUI(删除、更新和插入)速度。过时或丢失的统计信息将导致使用错误的连接算法和/或不准确的估计行数(这可能导致分页)。
在同一窗口中运行两个查询并包含实际的执行计划。这会将计划分开并告诉您哪一个更贵。它会给你缺少的索引提示。随着您更好地阅读计划,您将了解如何提高查询性能。
关于sql - 分页结果集中的选择子查询和左外连接哪个更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8059282/