在SQL Server 2005中产生多个SQL任务
我有许多存储的proc,我希望它们都在服务器上同时运行。理想情况下,服务器上的所有服务器都不依赖于与外部客户端的连接。
有什么选项可以启动所有这些程序并使它们同时运行(我什至不需要等到所有过程完成后再做其他工作)?
我想到了:
- 从客户端启动多个连接,每个连接都启动适当的SP。
- 为每个SP设置作业,然后从SQL Server连接或者SP启动作业。
- 使用xp_cmdshell启动等效于osql或者whetever的其他运行
- SSIS-我需要查看该软件包是否可以动态编写以处理更多SP,因为我不确定我的客户将获得多少访问权限
在作业和cmdshell的情况下,我可能会遇到DBA的权限级别问题...
如果我可以表驱动SP列表,则SSIS可能是一个不错的选择。
这是一个数据仓库的情况,工作在很大程度上是独立的,并且NOLOCK在星上普遍使用。该系统是一台8路32GB机器,因此如果发现问题,我将先将其加载并缩小规模。
我基本上分为三层,第1层具有少量进程,并且基本上取决于已经加载的所有事实/维度(有效,星星是第0层,是的,不幸的是,它们都需要加载),第2层具有许多依赖于第1层或者全部第1层的进程,第3层具有依赖于第2层的某些或者全部的多个进程。我已经在表中具有依赖项,并且将仅在最初启动所有proc。因为它们在一个层内是正交的,所以它们同时在一个特定的层中处于同一位置。
解决方案
SSIS是选择吗?我们可以创建一个具有并行Execute SQL任务的简单程序包,以同时执行存储的proc。但是,根据我们存储的proc的作用,并行启动可能会或者可能不会带来好处(例如,如果它们都访问相同的表记录,则可能必须等待释放锁等)。
有一次,我对称为Acumen Advantage的产品做了一些架构工作,该产品具有仓库经理来执行此操作。
这样做的基本策略是拥有一个带有存储过程及其依赖关系列表的控制数据库。根据依赖关系,我们可以进行拓扑排序以为其赋予运行顺序。如果执行此操作,则需要管理依赖关系,存储过程的所有先行条件必须在执行之前完成。仅在多个线程上按顺序启动sprocs本身不会完成此操作。
实现这一点意味着要敲掉SSIS的大部分功能,并实现另一个调度程序。对于产品而言,这是可以的,但对于定制系统而言,可能会适得其反。因此,一个更简单的解决方案是:
通过按维度垂直组织ETL(有时称为面向主题的ETL),我们可以在更粗粒度的级别上管理依赖项,其中单个SSIS包和一组proc将数据从提取到生成维度或者事实表。通常情况下,维度通常是孤立的,因此它们之间的相互依赖性最小。在存在相互依赖关系的地方,使一维(或者事实表)加载过程取决于上游需要的内容。
每个加载器都变得相对模块化,通过并行启动加载过程并让SSIS调度程序进行工作,我们仍然可以获得有用的并行度。依赖项将包含一些冗余。例如,ODS表可能不依赖于完成的维度加载,但是上游包本身会在完成之前将组件直接带入维度架构。但是,由于以下原因,在实践中这不太可能成为问题:
- 加载过程中可能还有许多其他任务可以同时执行
- 几乎最需要资源的任务几乎肯定是事实表加载,而事实表加载通常不会相互依赖。如果存在依赖关系(例如基于另一个表的内容的汇总表),则无论如何都无法避免。
我们可以构造SSIS包,以便它们从XML文件获取所有配置,并且可以在环境变量中外部提供位置。使用诸如Control-M之类的调度系统,可以很容易地实现这种事情。
这意味着可以在相对较少的人工干预下部署修改后的SSIS程序包。生产人员可以交给软件包以与存储过程一起部署,并且可以在每个环境中维护配置文件,而无需手动调整SSIS软件包中的配置。
我们可能要看一下服务代理及其激活存储过程...可能是一个选择...
最后,我创建了一个Cmanagement控制台程序,该程序启动进程Async,因为它们可以运行并跟踪连接。