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. 解决方法
最好是使用 >如果您希望所有数据都使用备份/恢复; BCP OUT& BCP IN或SSIS 要移动数据,取决于数据的数量/大小和n / w带宽,链接服务器将终止性能.
– 在源服务器中执行: 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! (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |