【发布时间】: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 列。
我有几个基本问题:
是使用多个 UPDATE 语句还是使用具有多个 JOIN 的单个 UPDATE 语句更好
如果我可以使用单个 UPDATE 语句,那么使用 INNER JOIN 或 LEFT JOIN 编写更新会更好
在处理大量数据时,JOIN 是否耗时? (注意:我从中获取列的所有服务器和表都有数百万条记录)哪个 JOIN 更好...?
我尝试过使用 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