假设我有一个包含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
答案 0 :(得分:2)
在你的情况下,必须执行内部选择以找到行1到25.但是 - 如果有一个索引并且可以预测 - 我假设将考虑外部查询。如果引擎可以预测第25行,那么它将尝试减少工作量。
你做什么或检查没有确定的预测。您可以检查执行计划并找出首先执行的计划,但下次(或使用其他版本的SQL Server)可能会有所不同。
您不会编写按照给定顺序执行的程序。你告诉引擎你想要得到什么,引擎找到实现这个目标的最佳方法。
如果在外部查询中某处需要其值,则首先执行子选择(可能)。如果外部查询允许使用给定过滤器大大减少主行,则引擎(可能)将尽可能晚地绑定子行。
这取决于你无法完全控制的许多情况。
好吧,您可以使用程序方法强制引擎解析您的订单。在这种情况下,您可以将要首先执行的查询结果随机混合到表中,然后在下一个查询中使用此表。
但是 - 几乎永远 - 这是人们甚至不应该想到的。引擎确实非常有效......