Meh*_*met 7 sql-server linked-server sql-server-2008
假设我的本地表有一个表Local_Table,我有另一个服务器和另一个数据库和表,这是Remote_Table(表结构是相同的).
Local_Table有数据,Remote_Table没有.我想从数据传输Local_Table到Remote_Table与此查询:
Insert into RemoteServer.RemoteDb..Remote_Table
select * from Local_Table (nolock)
Run Code Online (Sandbox Code Playgroud)
但表现相当缓慢.
但是,当我使用SQL Server导入导出向导时,传输速度非常快.
我究竟做错了什么?为什么使用Import-Export向导会很快,而使用insert-select语句会很慢?有任何想法吗?
最快的方法是提取数据而不是推送数据.按下表时,每行都需要连接,插入和断开连接.
如果您无法提取数据,因为您在服务器之间存在单向信任关系,那么解决方法是将整个表构造为一个巨大的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)
导入/导出向导本质上将作为批量插入来执行此操作,而您的代码则不然。
假设远程表上有聚集索引,请确保本地表上有相同的聚集索引,在远程服务器上全局设置跟踪标志 610,并确保远程处于简单或批量日志恢复模式。
如果您的远程表是堆(无论如何都会加快速度),请确保您的远程数据库处于简单或批量记录模式,将代码更改为如下所示:
INSERT INTO RemoteServer.RemoteDb..Remote_Table WITH(TABLOCK)
SELECT * FROM Local_Table WITH (nolock)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10368 次 |
| 最近记录: |