症状
假设你使用 sqlncli11 ODBC 驱动程序来访问 Microsoft SQL Server 2012 或应用程序中的 SQL Server 2014。 使用服务器游标和 SQLFetch/ SQLGETDATA 函数访问 SQL server 中的某些二进制大型对象(BLOB)数据时,尤其是对于较大数据类型(如 varbinary (max)或 varchar (max))而言,性能问题会发生。
原因
这是在 SQL Server 2012 ODBC 驱动程序中实现 SQLFetch/ SQLGetData 函数的设计问题。 当查询使用任何服务器游标时,ODBC 驱动程序将在SQLFetch实现期间调用sp_cursorfetch ,并且服务器会将所有 BLOB 发送到客户端。 然后,在执行 SQLGetData 时, sp_cursor 将再次引入所有 BLOB。 这将显著影响较大数据类型(如 varbinary (max)或 varchar (max))的性能。
解决方案
累积更新信息
新的实现调用 sp_cursoroption 在 sp_cursorfetch之前获取 TEXTPTR_ONLY,然后调用 sp_cursoroption 以将其放回 TEXTDATA 中的 sp_cursor。 这可以提高性能。在 SQL Server 的以下累积更新中,此问题首先已修复。
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 我们建议你下载并安装 SQL Server 的最新累积更新:
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。