在SQL Server 2005中生成多个SQL任务

时间:2008-10-02 15:16:00

标签: sql sql-server sql-server-2005 automation parallel-processing

我有许多存储过程,我想在服务器上同时运行。理想情况下,所有服务器都不依赖于与外部客户端的连接。

有什么选择可以启动所有这些并让它们同时运行(我甚至不需要等到所有进程都完成其他工作)?

我想到了:

  • 从中启动多个连接 一个客户,每个人都开始 适当的SP。
  • 为...设置工作 每个SP并从a开始工作 SQL Server连接或SP。
  • 使用 xp_cmdshell启动其他运行 相当于osql或whetever
  • SSIS - 我需要查看是否可以动态编写程序包以处理更多SP,因为我不确定我的客户将获得多少访问权限

在job和cmdshell的情况下,我可能会遇到来自DBA的权限级问题......

SSIS可能是一个不错的选择 - 如果我能用表驱动SP列表。

这是一个数据仓库的情况,并且工作在很大程度上是独立的,NOLOCK普遍用于明星。该系统是一台8路32GB机器,所以如果我发现问题,我将把它加载并缩小它。

我基本上有三层,第1层有少量进程,并且基本上取决于已经加载的所有事实/维度(有效,星星是第0层 - 是的,不幸的是它们都需要加载),第2层有许多进程依赖于第1层的部分或全部,而第3层有许多依赖于部分或全部第2层的进程。我已经在表中有依赖关系,并且最初只有同时启动特定图层中的所有过程,因为它们在图层中是正交的。

4 个答案:

答案 0 :(得分:2)

SSIS是您的选择吗?您可以创建一个具有并行执行SQL任务的简单包,以同时执行存储过程。但是,根据您的存储过程执行的操作,您可能会或可能不会从并行启动它中获益(例如,如果它们都访问相同的表记录,则可能必须等待锁定被释放等。)

答案 1 :(得分:1)

有一次,我对一个名为Acumen Advantage的产品进行了一些架构工作,该产品有一个仓库经理来完成这项工作。

这个的基本策略是让控制DB包含一个sprocs列表及其依赖项。根据依赖关系,您可以执行Topological Sort命令运行。如果执行此操作,则需要管理依赖关系 - 存储过程的所有前驱必须在执行之前完成。只是在多个线程上按顺序启动sprocs本身不会实现这一点。

实现这意味着将大部分SSIS功能放在头上并实现另一个调度程序。这对于产品来说是可以的,但对于定制系统而言可能过度。因此,一个更简单的解决方案是:

您可以通过按维度垂直组织ETL(有时称为面向主题的ETL )来管理更粗粒度级别的依赖关系,其中单个SSIS包和一组sprocs从中获取数据提取到生成维度或事实表。通常,尺寸大多是孤立的,因此它们具有最小的相互依赖性。在存在相互依赖性的情况下,使一个维度(或事实表)加载过程依赖于上游需要的任何内容。

每个加载器都变得相对模块化,并且通过并行启动加载进程并让SSIS调度程序将其解决,您仍然可以获得有用的并行度。依赖项将包含一些冗余。例如,ODS表可能不依赖于正在完成的维度加载,但是上游包本身在完成之前将组件一直带到维度模式。然而,由于以下原因,这在实践中不太可能成为问题:

  • 加载过程可能还有很多其他可以同时执行的任务
  • 最耗费资源的任务几乎肯定是表加载的事实,这些加载大多不相互依赖。如果存在依赖关系(例如,基于另一个表的内容的汇总表),则无论如何都无法避免。

您可以构建SSIS包,以便从XML文件中获取所有配置,并且可以在环境变量中提供该位置。使用Control-M等调度系统可以很容易地实现这种功能。 这意味着可以使用相对较少的手动干预来部署修改的SSIS包。生产人员可以将包与存储过程一起部署,并且可以在每个环境的基础上维护配置文件,而无需在SSIS包中手动调整配置。

答案 2 :(得分:1)

您可能希望查看服务代理及其激活存储过程...可能是一个选项......

答案 3 :(得分:1)

最后,我创建了一个C#管理控制台程序,它启动Async进程,因为它们可以运行并跟踪连接。