带有链接服务器查询SQL Server代码

ChinaITOldMan 2017-12-14 09:21:35
以下语句的T3是在另个网段SQL Server服务器上的表,现有以前两个问题请请教各位高手,谢谢。

1.与链接服务器的表做关联(如下面的查询代码),怎样可以提高速度(性能)?
2.执行计划是不是有办法显示链接服务器对应表的执行计划,怎样可以显示链接服务器对应表的执行计划?

SELECT * FROM localserver.dbo.t1 a
INNER JOIN localserver.dbo.t2 b ON a. F1=b.F1 AND a.F2=b.F2
INNER JOIN LinkedServer.dbname.dbo.T3 c ON a.F1= c.RF1 and a.F3=c.RF3
...全文
821 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dbLenis 2017-12-20
  • 打赏
  • 举报
回复
数据传输的速度,取决于: 1 你发送的数据量是否足够大? 2 你接收数据的速度是否快? 这种方式主要用于实时传输,对数据量的大小,控制的越精确越好。你说要 1 秒内传个 1 G的数据,这种方式就满足不了。但是要说同样时间传 几百K,还是可以的。前提是接收方数据库,负载不能太大,流出足够的资源来执行接收和解析的动作即可。
ChinaITOldMan 2017-12-20
  • 打赏
  • 举报
回复
引用 11 楼 wujiandao 的回复:
曾经做过一张图,用来加深对 Service Broker 整个流程的理解。 图2 是正确的流程。简单来说就是点对点发送消息的一套程序。你把你要发送的数据封装成 XML , 放在 Message 里面,发送给指定的服务器。
谢谢你,请问这个传送数据快吗?
dbLenis 2017-12-19
  • 打赏
  • 举报
回复
曾经做过一张图,用来加深对 Service Broker 整个流程的理解。

图2 是正确的流程。简单来说就是点对点发送消息的一套程序。你把你要发送的数据封装成 XML , 放在 Message 里面,发送给指定的服务器。

ChinaITOldMan 2017-12-18
  • 打赏
  • 举报
回复
引用 7 楼 wujiandao 的回复:
先回答第一个问题:假如需要和链接服务器上的远程表做 Join, 如何才能提高性能: 用Linked Server来查询,会有两种写法: 使用T-SQL来访问完整模式的表:SELECT * FROM LkSvr.db.dbo.TableX WITH(NOLOCK); 使用OpenQuery来实现:SELECT * FROM OPENQUERY(LkSvr,'SELECT * FROM LkSvr.db.dbo.TableX WITH(NOLOCK)') 第一种写法,是属于分布式查询,SQL Server 2012之前会通过调用Linked Server的实例来解析并生成执行计划。这么一来,这台Server就需要知道Linked Server相关表的统计信息,索引信息等等。而这些信息是直接从Linked Server复制过来的; 第二种写法,是将语句直接放到Linked Server上执行,由Linked Server来负责解析,和执行。 所以,用OpenQuery将数据导入本地的临时表,是一种很好的提高性能的方法。 再回答第二个问题:本质上是如何将数据同步到另一台服务器的问题。那么这里就涉及到两类方法了:一是实时同步;二是延时同步 1.实时同步:包括了触发器,分布式事务和 Service Broker 的方式。 触发器包括了:instead & after ; 分布式事务:将更新逻辑放在一个事务中即可; Service Broker方式:可以参考我写的一个小例子:http://blog.csdn.net/wujiandao/article/details/7285425 2. 延时同步: SQL Server 本身提供了很多的延时同步方法: Replication同步:参考 http://blog.csdn.net/wujiandao/article/details/51184721 Change Data Capture(CDC)同步:参考 http://blog.csdn.net/wujiandao/article/details/51253438 ETL方法: 用SSIS搭建同步数据的包,然后用任务调度器来调用这个包即可
引用 7 楼 wujiandao 的回复:
先回答第一个问题:假如需要和链接服务器上的远程表做 Join, 如何才能提高性能: 用Linked Server来查询,会有两种写法: 使用T-SQL来访问完整模式的表:SELECT * FROM LkSvr.db.dbo.TableX WITH(NOLOCK); 使用OpenQuery来实现:SELECT * FROM OPENQUERY(LkSvr,'SELECT * FROM LkSvr.db.dbo.TableX WITH(NOLOCK)') 第一种写法,是属于分布式查询,SQL Server 2012之前会通过调用Linked Server的实例来解析并生成执行计划。这么一来,这台Server就需要知道Linked Server相关表的统计信息,索引信息等等。而这些信息是直接从Linked Server复制过来的; 第二种写法,是将语句直接放到Linked Server上执行,由Linked Server来负责解析,和执行。 所以,用OpenQuery将数据导入本地的临时表,是一种很好的提高性能的方法。 再回答第二个问题:本质上是如何将数据同步到另一台服务器的问题。那么这里就涉及到两类方法了:一是实时同步;二是延时同步 1.实时同步:包括了触发器,分布式事务和 Service Broker 的方式。 触发器包括了:instead & after ; 分布式事务:将更新逻辑放在一个事务中即可; Service Broker方式:可以参考我写的一个小例子:http://blog.csdn.net/wujiandao/article/details/7285425 2. 延时同步: SQL Server 本身提供了很多的延时同步方法: Replication同步:参考 http://blog.csdn.net/wujiandao/article/details/51184721 Change Data Capture(CDC)同步:参考 http://blog.csdn.net/wujiandao/article/details/51253438 ETL方法: 用SSIS搭建同步数据的包,然后用任务调度器来调用这个包即可
谢谢你,请问Service broker主要是做什么用的? thanks!
Jason13189 2017-12-16
  • 打赏
  • 举报
回复
唐诗三百首 2017-12-16
  • 打赏
  • 举报
回复
引用 楼主 mcxhh2005 的回复:
1.与链接服务器的表做关联(如下面的查询代码),怎样可以提高速度(性能)?
--> 最好能把LinkedServer.dbname.dbo.T3表设同步数据到本地.
引用 楼主 mcxhh2005 的回复:
2.执行计划是不是有办法显示链接服务器对应表的执行计划,怎样可以显示链接服务器对应表的执行计划?
--> 执行计划无法显示链接服务器对应表的执行计划.
引用 6 楼 mcxhh2005 的回复:
请问有怎样好的方式将一个服务器上某一新增的数据Insert到另外一台服务器的表中,当此表的数据有update或delete操作在另一台服务器上也做update或delete操作,谢谢!
--> 推荐用SQL自带的复制工具(Replication)实现数据同步.
dbLenis 2017-12-16
  • 打赏
  • 举报
回复
先回答第一个问题:假如需要和链接服务器上的远程表做 Join, 如何才能提高性能: 用Linked Server来查询,会有两种写法: 使用T-SQL来访问完整模式的表:SELECT * FROM LkSvr.db.dbo.TableX WITH(NOLOCK); 使用OpenQuery来实现:SELECT * FROM OPENQUERY(LkSvr,'SELECT * FROM LkSvr.db.dbo.TableX WITH(NOLOCK)') 第一种写法,是属于分布式查询,SQL Server 2012之前会通过调用Linked Server的实例来解析并生成执行计划。这么一来,这台Server就需要知道Linked Server相关表的统计信息,索引信息等等。而这些信息是直接从Linked Server复制过来的; 第二种写法,是将语句直接放到Linked Server上执行,由Linked Server来负责解析,和执行。 所以,用OpenQuery将数据导入本地的临时表,是一种很好的提高性能的方法。 再回答第二个问题:本质上是如何将数据同步到另一台服务器的问题。那么这里就涉及到两类方法了:一是实时同步;二是延时同步 1.实时同步:包括了触发器,分布式事务和 Service Broker 的方式。 触发器包括了:instead & after ; 分布式事务:将更新逻辑放在一个事务中即可; Service Broker方式:可以参考我写的一个小例子:http://blog.csdn.net/wujiandao/article/details/7285425 2. 延时同步: SQL Server 本身提供了很多的延时同步方法: Replication同步:参考 http://blog.csdn.net/wujiandao/article/details/51184721 Change Data Capture(CDC)同步:参考 http://blog.csdn.net/wujiandao/article/details/51253438 ETL方法: 用SSIS搭建同步数据的包,然后用任务调度器来调用这个包即可
道素 2017-12-15
  • 打赏
  • 举报
回复
最好不要向你这种写法,我在做大量数据同步时,都是用openquery的方法,执行动态语句,在远程将所有都准备好,取到本地再和本地表关联 当然是用临时表也行 最尽量不要多个远程表再机上本地表直接join
zjcxc 2017-12-15
  • 打赏
  • 举报
回复
链接服务器通常是两种方式处理数据 1。 如果本地表要的数据量少,会根据链接表的主键值去链接服务器拉对应的数据 2 . 如果无法确定数据量多少,把链接服务器的表拉到地地缓存后做查询 所以链接服务器上是不会有什么执行计划的
ChinaITOldMan 2017-12-15
  • 打赏
  • 举报
回复
请问有怎样好的方式将一个服务器上某一新增的数据Insert到另外一台服务器的表中,当此表的数据有update或delete操作在另一台服务器上也做update或delete操作,谢谢!
ChinaITOldMan 2017-12-14
  • 打赏
  • 举报
回复
Any comments, thanks!
OwenZeng_DBA 2017-12-14
  • 打赏
  • 举报
回复
从链接服务器查询,这个执行计划是不可控的。最好的办法是先把链接服务器的数据同步过来,然后再做join
吉普赛的歌 2017-12-14
  • 打赏
  • 举报
回复
--尽量不要用远程表来连接
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
	DROP TABLE #tmp
SELECT * 
INTO #tmp 
FROM  LinkedServer.dbname.dbo.T3
CREATE CLUSTERED INDEX ix_tmp ON #tmp (RF1,RF3)

SELECT * FROM  localserver.dbo.t1  a 
	INNER JOIN  localserver.dbo.t2 b  ON a. F1=b.F1 AND a.F2=b.F2
	INNER JOIN  #tmp  c ON a.F1= c.RF1 and a.F3=c.RF3

DROP TABLE #tmp

22,301

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧