0x4*_*f6e 2 sql-server cursors sql-server-2012
我有一个使用 ODBC 访问 SQL Server 2012 数据库的应用程序,SQLSetStmtAttr
用于将SQL_SOPT_SS_CURSOR_OPTIONS
选项设置为SQL_CO_FFO
. 这意味着它从数据库中读取的内容由快速只进游标支持。
这在大多数情况下是可以的,但是有时快速只进游标的性能明显低于“通常”静态游标(我们将使用 default 获得的游标SQL_CO_OFF
)。
问题:有没有办法强制 SQL Server 不使用快进游标?
显然,正确的方法是更改应用程序,并且该过程正在进行中,但这需要时间,同时我正在寻找临时解决方法。
到目前为止,我唯一的想法是使用它:(来自Fast Forward-only Cursors)
Fast Forward-only 游标的隐式转换
在以下情况下,仅快进游标会隐式转换为其他游标类型:
- 如果 SELECT 语句将一个或多个表与触发器表(INSERTED/DELETED)连接起来,则游标将转换为静态游标
但是,即使是临时解决方法,这似乎也有点难看。可能有更好的方法吗?
旁注:在这种情况下,仅快速向前游标表现不佳的主要原因是它们不支持并行性。
对于非快进sys.dm_exec_cursors给我:
API | 快照 | 只读 | 全球 (0)
而快进选项是:
API | 快进| 只读 | 全球 (0)
快照选项比快进选项快 5 倍。如果我查看它们的查询计划,除了DegreeOfParallelism之外,它们没有太大不同。快照是 16 而快进是 0。问题是我们正在从视图中读取(我们没有太多控制权),而这些视图在其设计中是次优的。
不,据我所知,不可能在服务器端禁用快进游标。
如果您的应用程序请求快进游标,那么它将得到,至少在 SQL Server (2005+) 的“现代”版本中。从使用隐式光标转换:
快进游标永远不会被转换。
我早就忘记了在这种情况下,在 SQL Server 2000 和更早版本上什么可能有效,也可能无效。您可能会发现您参考的文档中的隐式转换案例之一可以暂时为您工作。
回到现代世界。快进游标可以编译为类似静态或类似动态的计划,但在任何一种情况下都将保留仅生成非并行计划的限制。
通常没有单一类别的游标或一组选项可以在所有情况下都表现良好。为了获得最佳性能,需要针对每种情况评估游标类型和选项集。