Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server是否始终以物理方式构建完整的结果集?_Sql Server - Fatal编程技术网

Sql server SQL Server是否始终以物理方式构建完整的结果集?

Sql server SQL Server是否始终以物理方式构建完整的结果集?,sql-server,Sql Server,假设我有一个包含20列和十亿行数据的大表。然后我运行一个简单的查询,如: select [First Name], [Last Name] from Audience; 之后,我按顺序读取结果集。在我开始读取结果集之前,SQL Server是否会在服务器端实际创建所有记录(即十亿条记录)?是否有任何查询计划在将结果集提供给客户机时动态生成结果集 我理解并发原因可能会阻止这一点。我可以给出任何提示,多用户访问是不可能的吗?也许我应该使用游标?取决于查询计划。如果查询不需要任何临时的内部结构,那么

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

select [First Name], [Last Name]
from Audience;
之后,我按顺序读取结果集。在我开始读取结果集之前,SQL Server是否会在服务器端实际创建所有记录(即十亿条记录)?是否有任何查询计划在将结果集提供给客户机时动态生成结果集


我理解并发原因可能会阻止这一点。我可以给出任何提示,多用户访问是不可能的吗?也许我应该使用游标?

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

判断的唯一方法是查看查询计划并检查每个步骤。你需要知道如何解释它们。。。例如,
DISTINCT
需要一个临时结构,而
FLOW DISTINCT
则不需要。如果查询计划显示一个
EAGER SPOOL
,您肯定要等待,尽管要避免它们


注意:您不能依赖于此--查询计划可能会发生变化,这不仅取决于架构或索引,还取决于数据库统计信息(例如选择性),这些统计信息总是在变化。

数据库将使用游标和可能存在的任何索引来迭代表中已有的记录。您是否建议SQL Server实际复制数据库以用于读取目的?是的,我的问题是如何猜测(当使用上述简单查询时)服务器何时会复制数据以用于读取目的,何时不会?对于简单的情况,不要考虑这一点,想想您的查询策略有多高效。有些情况下,数据库将正式复制记录,例如在带锁定的更新期间,但对于简单的
选择
,您无需担心这一点。@Buran,一旦执行计划中的最后一个阻塞操作符完成,结果将流式传输到客户端(例如
排序
)。像您的示例一样的一个简单查询可能只包含
SELECT
SCAN
,因此结果将立即返回,无需中间存储或处理。