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

时间:2011-11-09 01:14:31

标签: 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工作室中执行时,另一个查询将花费> 30秒。

  1. 使用内联选择查询真的是注入单列的最佳方法吗?
  2. 查询是否优化等待运行内联SELECT()语句,直到结果被分页后,是否会解释运行时间的差异?
  3. 仅供参考:在我的具体示例中,我们为othertable.col1添加了一个索引,它将查询时间缩短为0,但这个问题更侧重于JOIN与SELECT()是否更好。

1 个答案:

答案 0 :(得分:5)

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

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

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