我有许多存储过程,我想在服务器上同时运行。理想情况下,所有服务器都不依赖于与外部客户端的连接。
有什么选择可以启动所有这些并让它们同时运行(我甚至不需要等到所有进程都完成其他工作)?
我想到了:
在job和cmdshell的情况下,我可能会遇到来自DBA的权限级问题......
SSIS可能是一个不错的选择 - 如果我能用表驱动SP列表。
这是一个数据仓库的情况,并且工作在很大程度上是独立的,NOLOCK普遍用于明星。该系统是一台8路32GB机器,所以如果我发现问题,我将把它加载并缩小它。
我基本上有三层,第1层有少量进程,并且基本上取决于已经加载的所有事实/维度(有效,星星是第0层 - 是的,不幸的是它们都需要加载),第2层有许多进程依赖于第1层的部分或全部,而第3层有许多依赖于部分或全部第2层的进程。我已经在表中有依赖关系,并且最初只有同时启动特定图层中的所有过程,因为它们在图层中是正交的。
答案 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进程,因为它们可以运行并跟踪连接。