Sql server SQL Server是否始终以物理方式构建完整的结果集?
假设我有一个包含20列和十亿行数据的大表。然后我运行一个简单的查询,如:Sql server SQL Server是否始终以物理方式构建完整的结果集?,sql-server,Sql Server,假设我有一个包含20列和十亿行数据的大表。然后我运行一个简单的查询,如: select [First Name], [Last Name] from Audience; 之后,我按顺序读取结果集。在我开始读取结果集之前,SQL Server是否会在服务器端实际创建所有记录(即十亿条记录)?是否有任何查询计划在将结果集提供给客户机时动态生成结果集 我理解并发原因可能会阻止这一点。我可以给出任何提示,多用户访问是不可能的吗?也许我应该使用游标?取决于查询计划。如果查询不需要任何临时的内部结构,那么
select [First Name], [Last Name]
from Audience;
之后,我按顺序读取结果集。在我开始读取结果集之前,SQL Server是否会在服务器端实际创建所有记录(即十亿条记录)?是否有任何查询计划在将结果集提供给客户机时动态生成结果集
我理解并发原因可能会阻止这一点。我可以给出任何提示,多用户访问是不可能的吗?也许我应该使用游标?取决于查询计划。如果查询不需要任何临时的内部结构,那么即使在构建完整的记录集之前,也会立即得到响应。如果查询确实需要临时内部存储(例如,您正在以与任何索引都不匹配的方式对其进行排序,或者某个索引可用,但使用了另一个索引,因为它需要更少的I/O),则您必须等待构建完整的记录集 判断的唯一方法是查看查询计划并检查每个步骤。你需要知道如何解释它们。。。例如,
DISTINCT
需要一个临时结构,而FLOW DISTINCT
则不需要。如果查询计划显示一个EAGER SPOOL
,您肯定要等待,尽管要避免它们
注意:您不能依赖于此--查询计划可能会发生变化,这不仅取决于架构或索引,还取决于数据库统计信息(例如选择性),这些统计信息总是在变化。数据库将使用游标和可能存在的任何索引来迭代表中已有的记录。您是否建议SQL Server实际复制数据库以用于读取目的?是的,我的问题是如何猜测(当使用上述简单查询时)服务器何时会复制数据以用于读取目的,何时不会?对于简单的情况,不要考虑这一点,想想您的查询策略有多高效。有些情况下,数据库将正式复制记录,例如在带锁定的更新期间,但对于简单的
选择,您无需担心这一点。@Buran,一旦执行计划中的最后一个阻塞操作符完成,结果将流式传输到客户端(例如排序)。像您的示例一样的一个简单查询可能只包含SELECT
和SCAN
,因此结果将立即返回,无需中间存储或处理。