我已经使用 Ola Hallengren 的维护解决方案一段时间了,但我从未使用过 @DatabasesInParallel 参数。我正在考虑在索引和统计维护作业中使用它,其中我有一个运行时间较长(4 个多小时)的作业,并且有几个问题:
为了进行此设置,我假设最简单的方法是添加
@DatabasesInParallel='Y',
到现有 SQL Server 代理作业的参数列表中,然后在 SSMS 中对该作业执行脚本作业为 > 创建到...,这样我就有一个脚本创建精确的副本,然后只需将脚本中的 @job_name 更改为新作业名称,以便使用相同的参数创建新作业并使用相同的计划?我可以设置 3 个或更多作业并行运行,还是限制为 2 个?
我想要设置的服务器上有 5 个用户数据库。如果我在 上设置并行索引维护作业
@databases='USER_DATABASES'
,其中两个作业可以同时对同一数据库执行索引吗?例如,作业 1 正在处理一个具有大量碎片索引的大型数据库,作业 2 相当快地处理其他 4 个数据库,如果作业 1 仍在运行,作业 2 会结束,还是会开始处理作业 1 已经在处理的数据库?
或者,我可以设置单独的作业,而不是使用@databases='USER_DATABASES'
它们,我将指定每个用户数据库应该执行索引维护而不是使用@DatabasesInParallel
.
解决方案
如果你想并行执行 Ola 工作,那么你必须注意一些事情。文档中不是很清楚。
master
,但你确实使用了msdb
,对吧?)@DatabasesInParallel
给您希望在两个作业中并行执行的每个作业步骤。你完成了。
但上述方案并没有考虑到大数据库和小数据库。所以你可能会认为...
...为了将作业拆分为一个巨大的数据库和几个小数据库,那么您可以
@Databases
在每个作业步骤中传递附加参数并添加相关的数据库名称。然而,这将违背让多个并行作业仅通过数据库列表工作的目的。
替代解决方案
@Databases
在两个作业步骤中添加参数并...@Databases='HugeDatabase'
@Databases='USER_DATABASES,-HugeDatabase'
您本质上是告诉一个作业针对大型数据库执行任务,而另一作业针对所有其他用户数据库执行任务,除了
HugeDatabase
.回答您的问题
抱歉,我错过了回答您的实际问题。
上面解释了简单的解决方案。
我自己从来没有这样做过。我只为并行处理构建了一项额外的作业。但是,您应该能够创建多个作业,如文档中所述:
我在顶部的最初答案中提到了必须创建的附加表,用于处理作业如何选择可用数据库。作业将查看该表并选择第一个可用的数据库并将其标记为正在处理。下一个作业将查看同一个表并获取下一个尚未处理的空闲数据库,将其标记为正在处理,依此类推。
不会。一项作业将处理一个数据库并完全处理该数据库。(参见我对第二个问题的回答中的描述)