使用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工作室中执行时,另一个查询将花费> 30秒。
SELECT()
语句,直到结果被分页后,是否会解释运行时间的差异?仅供参考:在我的具体示例中,我们为othertable.col1
添加了一个索引,它将查询时间缩短为0,但这个问题更侧重于JOIN与SELECT()是否更好。
答案 0 :(得分:5)
性能调整是一门艺术,它涉及理解为什么计划按照它们的方式创建,计划中的每个部分的作用,以及如何影响更有效的选择路径。
缺少覆盖索引将导致扫描(过多读取)。索引太多会降低DUI的速度(删除,更新和插入)。过时或缺失的统计信息将导致使用错误的连接算法和/或不准确的估计行数(这可能导致分页)。
在同一窗口中运行两个查询并包含实际的执行计划。这将拆分计划并告诉你哪一个更贵。它会给你缺少索引提示。随着您更好地阅读计划,您将学习如何提高查询效果。