哪個更有效:從連結伺服器中選擇或插入連結伺服器?
假設我必須將數據從一台伺服器導出到另一台伺服器(通過連結伺服器)。哪種說法會更有效率?
在源伺服器中執行:
INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table] SELECT a, b, c, ... FROM [dbo].Udf_GetExportData()
或在目標伺服器中執行:
INSERT INTO [dbo].[Table] SELECT a, b, c, ... FROM OPENQUERY([OriginLinkedServer], 'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()')
哪一個會更快並且總共消耗更少的資源(源伺服器和目標伺服器)?兩台伺服器都是 SQL Server 2005。
假設我必須將數據從一台伺服器導出到另一台伺服器。
最好是使用
- 如果您希望所有數據使用備份/恢復;BCP 輸出和 BCP 輸入或 SSIS
- 如果您想要數據子集(僅限某些表),請使用 SSIS 或 BCP OUT & BCP IN
要移動數據,取決於數據的數量/大小和 n/w 頻寬,連結伺服器會降低性能。
在源伺服器中執行或在目標伺服器中執行 - 哪一個會更快並且總共消耗更少的資源(源伺服器和目標伺服器)?
– 在源伺服器中執行:
INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table] SELECT a, b, c, ... FROM [dbo].Udf_GetExportData()
當您在源伺服器上執行查詢並將數據推送到目標伺服器時,這稱為推送數據。這將是昂貴的操作。
— 在目標伺服器中執行
INSERT INTO [dbo].[Table] SELECT a, b, c, ... FROM OPENQUERY([OriginLinkedServer], 'SELECT a, b, c, ... FROM [OriginDB].[dbo].Udf_GetExportData()')
當您在目標伺服器上執行查詢並從源伺服器中提取數據時,這稱為拉數據。與前一種相比,這將更快且資源消耗更少(取決於提取的數據量)。
在 pull 方法的情況下,使用 SQL Profiler,您將看到跨連結伺服器(源伺服器)執行單個 SQL 語句,並將結果集從源伺服器拉到目標伺服器,這比 PUSH 有巨大的性能提升方法。
另一點需要注意的是:
在連結伺服器(使用 servername.databasename.schema.tablename aka 分佈式查詢的 4 部分命名約定)和 OPENQUERY 之間,通常 OPENQUERY 會很快。為什麼 ?
對於連結伺服器- 查詢優化器通過查看查詢命名法來創建執行計劃,並將其分解為遠端和本地查詢。本地查詢在本地執行,遠端查詢的數據從遠端伺服器收集、在本地清理、組合在一起並作為單個記錄集呈現給最終使用者。
對於 OPENQUERY - 在指定的連結伺服器上執行指定的傳遞查詢。SQL Server 將傳遞查詢作為未解釋的查詢字元串發送到 OLE DB 數據源。因此,SQL 不會對查詢應用任何類型的邏輯,也不會嘗試估計該查詢會做什麼,它只會將指定的查詢按原樣傳遞給目標連結伺服器。當您不在一個查詢中引用多個伺服器時,打開查詢很有用。它通常很快,因為 SQL 不會將其分解為多個操作,並且不會對收到的輸出執行任何本地操作。
優秀的閱讀參考: