链接服务器插入 - 选择性能

Meh*_*met 7 sql-server linked-server sql-server-2008

假设我的本地表有一个表Local_Table,我有另一个服务器和另一个数据库和表,这是Remote_Table(表结构是相同的).

Local_Table有数据,Remote_Table没有.我想从数据传输Local_TableRemote_Table与此查询:

Insert into RemoteServer.RemoteDb..Remote_Table
select * from Local_Table (nolock)
Run Code Online (Sandbox Code Playgroud)

但表现相当缓慢.

但是,当我使用SQL Server导入导出向导时,传输速度非常快.

我究竟做错了什么?为什么使用Import-Export向导会很快,而使用insert-select语句会很慢?有任何想法吗?

Tyl*_*Cox 8

最快的方法是提取数据而不是推送数据.按下表时,每行都需要连接,插入和断开连接.

如果您无法提取数据,因为您在服务器之间存在单向信任关系,那么解决方法是将整个表构造为一个巨大的T-SQL语句并立即运行它.

DECLARE @xml XML

SET @xml = (
        SELECT 'insert Remote_Table values (' + '''' + isnull(first_col, 'NULL') + ''',' +
            -- repeat for each col
            '''' + isnull(last_col, 'NULL') + '''' + ');'
        FROM Local_Table
        FOR XML path('')
        ) --This concatenates all the rows into a single xml object, the empty path keeps it from having <colname> </colname> wrapped arround each value

DECLARE @sql AS VARCHAR(max)

SET @sql = 'set nocount on;' + cast(@xml AS VARCHAR(max)) + 'set nocount off;' --Converts XML back to a long string

EXEC ('use RemoteDb;' + @sql) AT RemoteServer
Run Code Online (Sandbox Code Playgroud)

  • 每一行.哇.好吧,这解释了每秒<100行的插入速度.`从远程服务器选择*进入LocalTable',100,000行只需要一两秒钟.但是"从LocalTable插入RemoteServer"在运行一分钟后只插入了1000行.疯.谁设计了这个可怕的系统? (2认同)

Pet*_*ter 3

导入/导出向导本质上将作为批量插入来执行此操作,而您的代码则不然。

假设远程表上有聚集索引,请确保本地表上有相同的聚集索引,在远程服务器上全局设置跟踪标志 610,并确保远程处于简单或批量日志恢复模式。

如果您的远程表是堆(无论如何都会加快速度),请确保您的远程数据库处于简单或批量记录模式,将代码更改为如下所示:

INSERT INTO RemoteServer.RemoteDb..Remote_Table WITH(TABLOCK)
SELECT * FROM Local_Table WITH (nolock)
Run Code Online (Sandbox Code Playgroud)