SQL:是首先执行的主查询还是子查询?

时间:2016-10-17 07:49:40

标签: sql sql-server

假设我有一个包含10'000条记录的表“MyTable”; 当我运行下面的查询只获得25条记录时:它是先选择所有10'000条记录再返回25条记录,还是由SQL解析器自动优化查询?

SELECT *
FROM
   (
    SELECT HPE.ID, 
           HPE.EventTitle, 
           HPE.EventDate, 
           HPE.EventLocation, 
           HPE.SortOrder,
           CASE HPE.FlagShowInShop
               WHEN 1 THEN 'Yes'
               ELSE 'No'
           END AS FlagShowInShop, 
           HPE.ShowFrom, 
           HPE.ShowTo, 
           HPE.FK_Language, 
           HPE.FK_Region, 
           ISNULL (EG.Name, 'BIG EVENTS') AS EventGenre, 
           ROW_NUMBER () OVER
                              (ORDER BY HPE.FK_EventGenre_Value, 
                                        HPE.SortOrder
                              ) AS RowNum
      FROM [MyTable] AS HPE
           LEFT JOIN [MySecondTable] AS EG ON HPE.FK_EventGenre_Value=EG.Value
   ) AS HomePageEventsWithRowNumber
WHERE RowNum BETWEEN 1 AND 25

1 个答案:

答案 0 :(得分:2)

在你的情况下,必须执行内部选择以找到行1到25.但是 - 如果有一个索引并且可以预测 - 我假设将考虑外部查询。如果引擎可以预测第25行,那么它将尝试减少工作量。

你做什么或检查没有确定的预测。您可以检查执行计划并找出首先执行的计划,但下次(或使用其他版本的SQL Server)可能会有所不同。

SQL Server不是程序引擎

您不会编写按照给定顺序执行的程序。你告诉引擎你想要得到什么,引擎找到实现这个目标的最佳方法。

如果在外部查询中某处需要其值,则首先执行子选择(可能)。如果外部查询允许使用给定过滤器大大减少主行,则引擎(可能)将尽可能晚地绑定子行。

这取决于你无法完全控制的许多情况。

你能做什么,但真的应该避免:

好吧,您可以使用程序方法强制引擎解析您的订单。在这种情况下,您可以将要首先执行的查询结果随机混合到表中,然后在下一个查询中使用此表。

但是 - 几乎永远 - 这是人们甚至不应该想到的。引擎确实非常有效......

进入基于集合思维的明亮之光!