使用不同服务器上的多个表中的多列更新临时表

时间:2014-01-22 18:11:09

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

我有一个存储过程,它可以连接到三个不同的服务器,并从所有服务器获取值:

 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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

根据您预测的数据集,我的链接服务器的个人历史记录(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)