狀況
請考慮下列情況:
-
本機伺服器與遠端伺服器,均由 Microsoft SQL Server 2012年執行個體之間設定連結的伺服器。
-
使用一個定序,例如不區分大小寫的定序被設定本機伺服器。
-
遠端伺服器會有不同的定序,從本機伺服器,例如區分大小寫的定序裡,均設定一個物件。
-
連線是從 Microsoft JDBC 驅動程式的 SQL Server,SQL Server、 SQL OLE DB 提供者,或 SQL 原生的用戶端的 Microsoft ODBC 驅動程式到本機伺服器。
-
驅動程式會呼叫sp_prepexec預存程序在本機伺服器的備製陳述式中執行異動性 SQL 更新查詢。
-
查詢更新遠端伺服器上的資料表。這包括使用不同的定序,從本機伺服器的資料行物件。
在這個案例中,您可能會遇到效能變慢的查詢執行。如果您檢查更新查詢的執行計劃時,您可能會看到遠端掃描會執行在遠端伺服器的資料表,不篩選。因此,查詢會掃描遠端資料表,然後擷取至本機伺服器的所有資料列時,可能會執行許多讀取。
例如,查詢已準備好在本機伺服器具有預設的不區分大小寫定序,而遠端伺服器中有一個資料表T1包含資料行是區分大小寫。此更新程式會掃描所有的資料列的T1。
DECLARE @p1 INTEXEC sp_prepexec @p1 output, N'@P0 NVARCHAR(16), @P1 NVARCHAR(16)',
N'UPDATE RemoteServer.RemoteDatabase.dbo.T1 SET COL1=@P0 WHERE COL2=@P1',
N'a', N'a'
SELECT @p1
原因
準備的更新查詢將會掃描遠端資料表,定序不符兩台伺服器上時,就會發生這個問題。
解決方案
您套用此 hotfix 之後,您就需要啟用追蹤旗標在裝載的連結的伺服器的本機伺服器上的 4199。如何啟用 traceflag,請參閱其他的 「 資訊 」 一節。
注意此 hotfix 只適用於裝載連結的伺服器,並最佳化已備妥的陳述式的本機伺服器中。此 hotfix 不會套用到遠端伺服器。
下列的累積更新 SQL Server 的第一次修正問題。
SQL Server 2012 sp1 的累積更新 6/en-us/help/2874879
SQL Server 的每個新的累積更新包含的所有修補程序與安全性修正,全都包含在先前的累積更新。检验 SQL Server 的最新的累積更新︰
Hotfix 資訊支援的 hotfix 可從 Microsoft 取得。不過,此 Hotfix 僅用於修正本文中所述的問題。此 Hotfix 只適用於發生此特定問題的系統上。
如果 hotfix 可供下載,在此知識庫文件頂端將出現「可用的 Hotfix」區段。如果這個區段不會出現,將要求提交給 Microsoft 客戶服務及支援取得 Hotfix。
注意如果發生其他問題,或如果需要進行疑難排解,您可能必須建立個別的服務要求。收取支援費用會套用到其他支援問題和此特定 hotfix 無法解決的問題。如 Microsoft 客戶服務及支援的電話號碼或建立個別的服務要求的完整清單,請造訪下列 Microsoft 網站︰
http://support.microsoft.com/contactus/?ws=support注意「 下載 Hotfix 」 表單會顯示 hotfix 可用的語言。如果看不到您的語言,是因為未提供該語言的 Hotfix 。
先決條件若要套用此 hotfix,您必須安裝 SQL Server 2012年。
登錄資訊您不必套用此 hotfix 後,變更登錄。
Hotfix 取代資訊此 hotfix 不會取代任何其他 hotfix。
狀態
Microsoft 已確認這是<套用>一節所列出的 Microsoft 產品的問題。
因應措施
工作有很多問題,請使用下列方法之一︰
-
請勿在用戶端應用程式的原始程式碼中使用已備妥的陳述式。您可以改用臨機操作陳述式或可呼叫的陳述式,例如預存程序如果驅動程式支援這些介面。
-
兩台伺服器上使用相符的定序。
更多的資訊
若要啟用追蹤旗標,新增 [啟動參數-T4199或TRACEON(4199,-1) DBCC之前已備妥的陳述式被編譯以啟用行為。
您可以使用下列方法之一來啟用追蹤旗標︰
-
您啟動 SQL Server 之前,請使用 Microsoft SQL Server 組態管理員、 以滑鼠右鍵按一下受影響的執行個體,並新增 [啟動參數-T4199 ,讓它在未來保存在重新啟動,以及之間的執行個體的所有連接。
-
動態啟用設定在執行階段,一旦取得啟動服務,以及全域所有連線的"(-1)。"請務必釋放程序快取,如果您打算進行測試以參數開啟或關閉。
使用下列命令以啟用設定全域並以動態方式︰
DBCC TRACEON(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE
使用下列命令以停用設定全域並以動態方式︰
DBCC TRACEOFF(4199,-1)DBCC TRACESTATUS(-1)
DBCC FREEPROCCACHE