因此,我想对数据库中的所有表运行更新统计信息。一个限制是我不能一次对20个以上的统计表运行更新统计。例如,如果表A具有40个统计信息,那么我必须将其分为2个更新统计信息语句。这是因为其中一些表确实很大,并且我正在处理的应用程序在数据库调用上存在超时。
我一直在尝试并行化此过程。首先,我尝试使用parallel.foreach
创建每个块最多20个统计表的作业。但是,尽管我将maxDegreeOfParallelism
设置为5,但通常一次只对我的数据库执行3个查询,但我仍注意到。我已经读过parallel.foreach
如何在线程之间进行资源共享/分区的工作,但是如果我仅对每个任务进行一次数据库调用,我觉得没有理由使用它。
然后,我尝试使用信号量创建任务并限制活动任务的数量。使用相同的5个任务限制,我能够看到5个查询同时在数据库上运行,但是总体而言,与使用parallel.foreach相比,并没有太大的性能优势。
现在,我真正想知道的一件事是,该过程的速度如何随运行Update Statistics
的数量而扩展。我注意到了一些事情,但可能是错的。每当我尝试在同一张表上同时运行两个Update statistics
--assume these are running in different tasks
Update Statistics A (stattable1, stattable2,....stattable20);
Update Statistics A (stattable21, stattable22....);
一个查询似乎被阻止,直到另一个查询结束。我想这很有意义,因为我们正在尝试扫描同一张表。
然后,同时在两个不同的表上运行Update Statistics
--assume these are running in different tasks
Update Statistics A (stattable1, stattable2,....);
Update Statistics B (stattable1, stattable2....);
我确实注意到,与每次运行一次更新相比,每个查询花费的时间更长,但是这种延迟似乎并没有完全被阻止(即,如果Update Statistics A
花费2分钟而Update Statistics B
他们两个人都需要2分钟才能完成,可能要3分钟才能完成,而不是4分钟。这是我真正不确定的,随着并行运行更多查询,性能如何扩展。
基本上,我只是想知道使用任务与parallel.foreach相比是否更有意义,以及构造这些查询以提高性能的最佳方法。