【发布时间】:2017-02-07 14:12:32
【问题描述】:
假设我有一个包含 20 列和十亿行数据的大表。然后我运行一个简单的查询,例如:
select [First Name], [Last Name]
from Audience;
之后我依次读取结果集。 SQL Server 会在我开始读取结果集之前在服务器端物理创建所有记录(即十亿条记录)吗?是否有任何查询计划可以在将结果集提供给客户端的同时动态构建结果集?
我知道并发原因可能会阻止这种情况。我可以提示无法进行多用户访问吗?也许我应该使用游标?
【问题讨论】:
-
数据库将使用游标和可能存在的任何索引遍历表中已经存在的记录。您是否建议 SQL Server 实际上为读取目的制作数据库副本?
-
是的,我的问题是我如何猜测(当使用像上面这样的简单查询时)服务器何时会复制数据以用于读取目的,何时不会?
-
对于简单的情况,不要考虑这个,想想你的查询策略有多高效。在某些情况下,数据库会正式复制记录,例如在锁定更新期间,但对于简单的
SELECT,您无需担心这一点。 -
@Buran,一旦执行计划中的最后一个阻塞操作符完成(例如
SORT),结果将被流式传输到客户端。像您的示例这样的简单查询可能仅包含SELECT和SCAN,因此将立即返回结果,无需中间存储或处理。
标签: sql-server