这是我在博客上的第一个问题。
我正面临更新声明的问题。
我正在使用一台服务器(源服务器 - SS),并希望每天更新另一台服务器(目标服务器 - TS)上的表。但更新需要很长时间才能完成。
SS.Table1 - Row count over 5 Million
TS.Table2 - Row count over 50 Million
我每天都希望用SS.Table1中的约500条记录更新TS.Table2。
由于两个表都很大,我已将SS.Table1中的记录提取到Temp Table #Temp
Update TS.Table2
set TargetTable.ColumnName = SourceTable.ColumnName
from TS.Table2 T
JOIN #Temp S
on T.Col1 = S.Col1
and T.Col2 = S.Col2
注1:Col1和Col2都在目标表和源表上都有聚簇索引
注2:选择具有相同连接条件的Milli Seconds数据时。
注3:我尝试使用CTE更新Target表,但没有性能提升。
注4:即使更新一条记录,也需要500条记录
注意5:我在一些在线文章中,删除目标表和重新创建的索引可以提高性能并完成相同但没有改进。
如果没有提供足够的信息,请回复。
此致
答案 0 :(得分:1)
过去我遇到过类似的问题。我使用的是SQL Server 2008.该版本需要sysadmin权限才能访问远程统计信息。没有远程统计信息,风险在于SQL Server将检索远程数据(50M行)并在本地执行。 http://www.sqlbadpractices.com/linked-servers-and-distributed-queries/ 我使用强制执行远程执行的openquery绕过了这个问题。
在您的情况下,您可以在远程登台表中写入500行,并使用openquery在远程服务器中完全执行更新。