sql-server – 哪一个更有效:从链接服务器中选择还是插入链接服务器?

前端之家收集整理的这篇文章主要介绍了sql-server – 哪一个更有效:从链接服务器中选择还是插入链接服务器?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我必须将数据从一个服务器导出到另一个服务器(通过链接服务器).哪种陈述会更有效率?

在源服务器中执行:

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

原文链接:https://www.f2er.com/mssql/80274.html

猜你在找的MsSQL相关文章