徵狀
假設您在應用程式中使用 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_cursor之前調用sp_cursoroption將它放回 TEXTDATA。 這樣可以改善效能。此問題最初是在 SQL Server 的後續累積更新中修正。
每個新的 SQL Server 累計更新都包含所有的修正程式,以及前一個累積更新中所包含的所有安全性修正程式。 我們建議您下載並安裝最新的 SQL Server 累積更新:
狀態
Microsoft 已確認本篇文章<適用於>一節所列之 Microsoft 產品確實有上述問題。