在源服务器中执行:
INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table] SELECT a,b,c,... FROM [dbo].Udf_GetExportData()
或者在目标服务器中执行:
INSERT INTO [dbo].[Table] SELECT a,... FROM OPENQUERY([OriginLinkedServer],'SELECT a,... FROM [OriginDB].[dbo].Udf_GetExportData()')
哪一个更快,消耗的资源总量更少(源服务器和目标服务器)?两台服务器都是sql Server 2005.
解决方法
Suppose I have to export data from one server to another.
最好是使用
>如果您希望所有数据都使用备份/恢复; BCP OUT& BCP IN或SSIS
>如果您想要数据子集(仅限某些表),请使用SSIS或BCP OUT& BCP IN
要移动数据,取决于数据的数量/大小和n / w带宽,链接服务器将终止性能.
Executing in source server Or executing in target server – Which one will be faster and consume fewer resourcers in total (both source and target server)?
– 在源服务器中执行:
INSERT INTO [DestinationLinkedServer].[DestinationDB].[dbo].[Table] SELECT a,... FROM [dbo].Udf_GetExportData()
当您在源服务器上执行查询并将数据推送到目标服务器时,这称为PUSHING Data.这将是昂贵的操作.
—在目标服务器中执行
INSERT INTO [dbo].[Table] SELECT a,... FROM [OriginDB].[dbo].Udf_GetExportData()')
当您在目标服务器上执行查询并从源服务器提取数据时,这称为PULLING Data.与前一个相比,这将更快,资源更少(取决于拉动的数据量).
对于pull方法,使用sql事件探查器,您将看到在链接服务器(源服务器)上执行单个sql语句,并且结果集从源服务器切换到目标服务器,这比PUSH有巨大的性能提升方法.
另一点需要注意的是:
在链接服务器(4部分命名约定使用servername.databasename.schema.tablename a.k.a分布式查询)和OPENQUERY之间,通常OPENQUERY会很快.为什么?
对于链接服务器 – 查询优化器通过查看查询命名法创建执行计划,并将其分解为远程和本地查询.本地查询在本地执行,远程查询的数据从远程服务器收集,在本地擦除,组合在一起并作为单个记录集呈现给最终用户.
对于OPENQUERY – 在指定的链接服务器上执行指定的传递查询. sql Server将传递查询作为未解释的查询字符串发送到OLE DB数据源.因此,sql不会对查询应用任何类型的逻辑,也不会尝试估计查询将执行的操作,它只是将指定的查询原样传递给目标链接服务器.在一个查询中不引用多个服务器时,打开查询很有用.它通常很快,因为sql不会将其分解为多个操作,并且不会对接收的输出执行任何本地操作.
优秀的阅读参考:
> Linked servers and performance impact: Direction matters!
> Distributed Queries
> OPENQUERY