使用多线程进程更新表并根据优先级更新某些行

时间:2009-08-16 22:27:20

标签: sql multithreading linq-to-sql ssis

我有一张顾客表。这个表可以很大,数百万行。每个小时,我都有一个控制台应用程序,它通过所有客户并更新另一个表,其中包含过去一小时内发生的客户更改。

我想要做的是两件事:(1)让控制台应用程序(或SSIS包)具有多线程,以便我可以运行其中几个以便更新完成更快。它需要是智能的,并且能够以某种方式选择客户,以便两个线程永远不会为同一客户执行代码。

(2)如果新客户注册,他不应该等待一小时或直到控制台应用程序找到他来获取数据。应该有另一个流程/应用程序,其中包含新客户队列并对其进行运行分析。问题是,如果每小时进程也在该进程上运行代码,我想阻止此队列在客户上运行代码。

从我在此处的先前线程中读到的内容,SSIS就是我想要使用的。它是否正确? SSIS是正确的工具吗?

我一直在研究SSIS,我不知道从哪里开始以及如何为此做多线程方法。我希望有一些粗略的指示,以便我更好地了解从哪里开始和研究什么。

谢谢!

2 个答案:

答案 0 :(得分:3)

SSIS是正确的工具。正确的方法是创建数据流任务,不要担心多线程。 SSIS将为您解决这个问题,特别是SSIS 2008。

您需要担心的程度是,您需要注意某些数据流转换需要在生成任何输出之前处理所有输入行。例如,排序转换必须等到所有行都传递给它,进行排序,然后开始传递排序的行。如果你避免这种转换,那么SSIS将非常乐意优化使用的线程数。


在优先级问题上,我没有想到这一点,但批处理作业如何忽略新客户。让另一个SSIS包更频繁地运行,对新行进行处理,然后标记它们是第一次处理的。这样就不会有冲突。

答案 1 :(得分:0)

我不确定SSIS是否可行。您可以使用纯T-SQL来完成它。

基本上,您希望以非阻塞但独占的方式遍历行,并使用单独的进程来检测新行。每一行“锁定”都需要进一步处理。

使用每个控制台应用程序的UPDLOCK,ROWLOCK和READPAST来管理行选择:"Processing Data Queues in SQL Server with READPAST and UPDLOCK"

每个进程现在拥有一行(非阻塞但独占),可以使用它。

将数据传输到另一个表可以在相同的代码中完成,例如存储过程。

你甚至可以在里面使用WHILE循环来进行处理。设置它运行,就是这样。如果没有找到任何行,则可以构建一个WAITFOR。

就个人而言,我不会使用SSIS。