Sql 在分页结果集中,选择子查询或左外联接哪个更快

Sql 在分页结果集中,选择子查询或左外联接哪个更快,sql,sql-server,performance,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) ro

使用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秒

  • 使用内联选择查询真的是注入单个列的最佳方式吗
  • 查询优化是否会等待运行内联
    SELECT()
    语句,直到结果被分页之后,这会解释运行时间的不同吗

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

    性能调整是一门艺术,它涉及到理解为什么要以这种方式创建计划,计划中的每个部分都做了什么,以及如何影响选择更有效的路径

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


    在同一窗口中运行两个查询,并包含实际执行计划。这将把计划分开,告诉你哪一个更贵。它将为您提供缺少的索引提示。随着您在阅读计划方面的进步,您将学习如何提高查询性能。

    这两种方法都可以编译吗?看起来最里面的查询缺少
    中的。添加了中的,我没有测试这个精确的查询,因为我从遇到的实际示例中对其进行了清理,这样会使问题更清晰。最好的方法是:使用设置统计时间来运行两个查询以查看它们的持续时间。您还可以运行跟踪监视持续时间。在第二个示例中,您不需要加入子查询。只需直接连接到
    othertable
    ,并将您的
    分组依据
    放入附带的查询中。在执行联接之前,查询引擎将
    分组依据
    应用于
    其他表
    ,您的查询将具有更少的级别。这两个查询看起来具有完全相同的查询计划。您是否检查了这两个方面的查询计划?