SQL Server/SSIS更新太慢
我有一个sql server 2008表,其中有超过200000个用户,每个用户都有一个唯一的用户ID,但有重复的电子邮件地址 e、 g 用户标识跨越各种sql Server(200820052000)上的各种表。我们希望合并用户-因此我们最终得到一个电子邮件地址和一个选定的用户ID(我已经有了一个选择正确用户ID的过程) 问题是,在SSIS中更新每个用户需要4分钟(使用存储过程扫描表以查找旧的用户ID并更新到我们想要保留的用户ID)。解决这个问题意味着整个过程将需要615天 还有别的方法吗 如果您能提供任何帮助或建议,我们将不胜感激!SQL Server/SSIS更新太慢,sql,sql-server-2008,stored-procedures,ssis,Sql,Sql Server 2008,Stored Procedures,Ssis,我有一个sql server 2008表,其中有超过200000个用户,每个用户都有一个唯一的用户ID,但有重复的电子邮件地址 e、 g 用户标识跨越各种sql Server(200820052000)上的各种表。我们希望合并用户-因此我们最终得到一个电子邮件地址和一个选定的用户ID(我已经有了一个选择正确用户ID的过程) 问题是,在SSIS中更新每个用户需要4分钟(使用存储过程扫描表以查找旧的用户ID并更新到我们想要保留的用户ID)。解决这个问题意味着整个过程将需要615天 还有别的方法吗 如
谢谢假设您希望最新的ID成为赢家:
update
TableContainingUserIDs
set
userid = IDTOKeep
from
TableContainingUserIDs
inner join (
select max(userid) over (partition by email) as IDToKeep, userid as OldUserID
from
tbl
) KeeperSet
on KeeperSet.userid = TableContainingUserIDs.userID
如果您有一些其他逻辑来选择赢家ID,请创建一个查询或一个临时表,以该格式存储数据
IDTOKEP旧用户ID
然后用查询/表替换该查询中的KeeperSet别名
然后用userid冲洗并重复每个辅助表
如果您使用的是SSI,而不是存储过程,为什么不使用暂存表,然后一批更新
存储过程并不慢,问题是在数据流任务结束时逐行运行OLEDB命令完全违背了数据库和集合论的目的。将数据转移到同一数据库,运行一个基于集合的查询,就完成了。我认为第一步是创建一个参考数据临时表,例如:
fromId toId
-------------
1234 34567
1235 34567
1236 789
等等
然后将这些数据加载到每个数据库实例中
然后使用游标依次选择每条记录,并根据游标为每个需要更新的表运行update语句
然后,该进程将在SQL和同一台计算机中运行。它还可以跨服务器和实例并行运行。为什么要使用SSI来运行存储过程?我们需要更详细的信息,了解您在执行清理时实际运行的代码,每个用户需要4分钟。我们选择SSI是因为我们需要在多台服务器上同时运行该进程。我能够同时打开与它们所有的连接。通常,过去从SSI调用存储过程并不缓慢。这是一个完全不同的任务,我已经设定了!这是一个代码段:如果存在(从[DB].dbo.table WHERE UserID=old中选择UserID),则开始更新[DB].dbo.table SET UserID=new WHERE UserID=old END ELSE插入MERGERROR(UserID,Error)值(old,'在[DB].dbo.table]中不存在)混合SSI和存储过程I“我猜你是在一个For-Each循环中这样做的,而你不必这样做。。。。执行此操作时,同一SQL Server上需要的所有数据都是相同的,或者在中央服务器中是否有某种主数据。您需要更详细地解释您的流程,以便我们提供帮助,例如,数据集在哪里,软件包是如何设置的,SP的源代码是什么?除了我的经验之外,我的经验告诉我,最新的id几乎总是最难保存的id(通常是相关记录最少的记录,因此需要比保留旧记录更广泛的更新),这是一个很好的答案。
fromId toId
-------------
1234 34567
1235 34567
1236 789