【问题标题】:Updating a Temporary Table with many columns from Multiple Tables on Different Servers使用不同服务器上的多个表中的许多列更新临时表
【发布时间】:2014-01-22 18:11:08
【问题描述】:

我有一个存储过程,它访问三个不同的服务器并从所有服务器获取值,如下所示:

 Update #temp 
 set col1.temp = t1col1.table 
 from #temp  inner join table1.Server1 on temp.id = table1.id
 Update #temp 
 set col2.temp = t2col2.table 
 from #temp  inner join table2.Server1 on temp.id = table2.id
 Update #temp 
 set col3.temp = t3col3.table 
 from #temp  inner join table3.Server1 on temp.id = table3.id

注意:在上述更新语句之前,我已经使用本地服务器上的所有值更新了我的 temp

这就是我更新表格的方式。为了更好地优化并获得更快的结果,我这样做了:

update #temp
set  col1.temp = t1col1.table,
col2.temp = t2col2.table,
col3.temp = t3col3.table 
from #temp inner join table1.server1 on temp.id= table1.id
leftjoin table2.server1 on temp.id = table2.id
leftjoin table3.server1 on temp.id = table3.id

我的基本想法是将多次更新所需的时间减少到一次更新。此存储过程从 3 个不同的服务器生成大约 300,000 行和大约 30 列。

我有几个基本问​​题:

  1. 是使用多个 UPDATE 语句还是使用具有多个 JOIN 的单个 UPDATE 语句更好

  2. 如果我可以使用单个 UPDATE 语句,那么使用 INNER JOIN 或 LEFT JOIN 编写更新会更好

  3. 在处理大量数据时,JOIN 是否耗时? (注意:我从中获取列的所有服务器和表都有数百万条记录)哪个 JOIN 更好...?

  4. 我尝试过使用 INNER JOIN,但它不适用于表 2 和表 3;它只适用于 table1

以上 UPDATE 语句适用于服务器 1,它们与服务器 2 和服务器 3 相同,因为它们有一些我需要的值。

【问题讨论】:

  • 你使用什么约定从其他服务器中提取数据,链接服务器(technet.microsoft.com/en-us/library/ms188279.aspx)?
  • 我不明白你在说什么约定,但这就是我从 [server].tablename 中选择值的方式
  • @JordanBelfort 你的意思是 [database].tablename 吗?我在这里可能完全错了,但听起来更像是您在同一台服务器上有多个数据库。那么在不使用链接服务器或其他约定的情况下从多个地方提取数据是有道理的。所以服务器 1 将是 DB1,服务器 2 将是 DB2,等等......
  • 不,它就像 [server].Database.TableName 你可以做一个选择我猜他们是链接服务器

标签: c# sql sql-server-2008 optimization join


【解决方案1】:

根据您预测的数据集、我个人使用链接服务器的历史(4 个物理服务器上的 7 个 SQL 实例,一些表的上限为 50-100M 行/服务器),以及一些优秀的 TechNet 文章,我建议创建一个类似于

select t1col1.table, t2col2.table, t3col3.table 
from  table1 on temp.id= table1.id
leftjoin table2 on table1.id = table2.id
leftjoin table3 on table1.id = table3.id

然后跨链接服务器对视图执行单数连接。每个连接本质上都会创建一个新的 OLE 连接,并且 SQL 引擎可以决定将整个数据集拉到本地来执行连接。在保存数据的服务器上做尽可能多的事情,这将对性能产生重大影响。

好书:

linked-server-behavior-when-used-on-join-clauses

Linked Servers (Database Engine)

【讨论】:

  • 这将如何更新我的#temp 表,并且所有的 Select 语句仅适用于一台服务器更新..
  • 甚至我的旧方法都是一样的,我不能再用这个了;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2017-06-15
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多