这是 2 个相关的问题 1OPTION (FAST 1);
我们刚刚将我们的 ERP 数据库从 SQL 2000 EE 升级到 2008 R2 EE,我们注意到数据库中的阻塞增加了。我已将其范围缩小到我认为是供应商代码中的违规声明,即:
SELECT MAX(column)
FROM [table]
WHERE <condition>
OPTION (FAST 1);
spid 留下一个打开的事务并在表上锁定,阻塞所有其他客户端。但是,调用客户端似乎不再与服务器交互以告诉服务器它已收到数据以结束会话。
阅读有关 Query Hints 的文档,我看到了这个声明
FAST number_rows
指定查询已针对第一个 number_rows 的快速检索进行了优化。这是一个非负整数。返回第一个 number_rows 后,查询继续执行并生成完整的结果集。
这让我想知道客户端是否以某种方式中断了通信,服务器是否会保持事务打开,在第一n
行返回后处理完整的结果集并使事务保持打开状态?该流程是一个内部流程,因此我无法真正看到最终用户执行会话来执行此操作,而且这不是每次内部流程发生时都会发生的事情。但是,它只被内部进程使用。
阅读了Remus对 SO 的回答后,对于查询的简单性来说,这似乎有点过分了。查看查询,如果他们从未分组的人那里收到多个结果,MAX
那么有些事情很可疑。
因此,当我准备与供应商合作时,我想知道是否可以开始准确地将我们的阻塞问题归结为正在使用此查询提示这一事实。
请随时编辑/请求编辑,因为我知道这实际上可能不清楚。
如果它是一个返回超过 1 行的查询,我会推测供应商的某个人(回溯到什么时候,给定 SQL Server 的版本)偶然发现查询优化器在
FAST
被指定为提示时产生了一个更好的计划。由于它只返回 1 行,因此解释可能与无限猴子定理有更多共同点,而不是理性判断。一个小辈看到了一个提示,
FAST
并决定这比他的查询不快要好。该查询返回 1 行,因此没有进一步的结果集要处理。我倾向于怀疑堆栈中还有其他代码会导致问题。