异步填充

MicrosoftSQL Server 为异步填充大型键集驱动的游标或静态游标提供了优化的性能。由键集驱动的游标和静态游标使用在 tempdb 中创建的工作表。由键集驱动的游标使用工作表存储其键集(标识游标中行的键的集合)。静态游标使用工作表存储组成游标的行。如果 SQL Server 查询优化器估计由键集驱动的游标或静态游标中返回的行数将超过 sp_configure cursor threshold 参数的值,则服务器将启动一个单独的线程来填充工作表。控制权立即返回到应用程序,应用程序可以开始提取游标中前面的行,而不必等到整个工作表填充完成后才开始执行首次提取。

异步填充游标会引起额外的开销。更有效的方法是不要异步填充小游标,从而使 sp_configure cursor threshold 值不至于设置得太低。保留异步填充供大型游标使用。

注意注意

SQL Server 不支持异步生成由键集驱动的或静态的 Transact-SQL 游标。Transact-SQL 游标操作(如 OPEN 或 FETCH)通常为批处理,因此不需要异步生成 Transact-SQL 游标。SQL Server 继续支持异步键集驱动的或静态的应用程序编程接口 (API) 服务器游标,但由于每个游标操作的客户端来回行程,需要注意其中的低滞后时间 OPEN。

@@CURSOR_ROWS 函数报告游标中的行数。如果对具有正被填充的工作表的游标选择 @@CURSOR_ROWS,@@CURSOR_ROWS 将返回一个负数。返回数字的绝对值就是到目前为止工作表中已填充的行数。例如,如果在填充由键集驱动的游标的键集时选择 @@CURSOR_ROWS,但键集中已包含 1,243 个键,则 @@CURSOR_ROWS 返回的值为 -1243。