SQL Server是否始终物理构建完整的结果集?

时间:2017-02-07 00:09:50

标签: sql-server

想象一下,我有一个包含20列和数十亿行数据的大表。然后我运行一个简单的查询,如:

select [First Name], [Last Name]
from Audience;

之后我按顺序读取结果集。在我开始阅读之前,SQL Server是否会在结果集中物理地创建服务器端的所有记录(即十亿条记录)?是否有任何查询计划会在将结果集提供给客户端时动态构建结果集?

我理解并发原因可能会阻止这种情况。我可以提供任何不可能进行多用户访问的提示吗?也许我应该使用游标?

1 个答案:

答案 0 :(得分:3)

取决于查询计划。如果查询不需要任何临时内部结构,那么即使在构建完整记录集之前,您也会立即获得响应。如果查询确实需要临时内部存储(例如,您正在以与任何索引不匹配的方式对其进行排序,或者索引可用但由于它需要较少的I / O而使用不同的索引)那么您将不得不等待直到构建完整的记录集。

唯一的方法是查看查询计划并检查每一步。您将需要知道如何解释它们...例如,DISTINCT将需要临时结构,而FLOW DISTINCT则不需要。EAGER SPOOL。如果查询计划显示{{1}},您肯定必须等待,尽管there are a few things you can do可以避免它们。

注意:您不能依赖于此 - 查询计划不仅可以根据模式或索引进行更改,还可以根据数据库统计信息(例如选择性)进行更改,这些统计信息总是在不断变化。