所以我想在我的数据库中的所有表上运行更新统计信息。一个限制是我不能一次对超过 20 个统计表运行更新统计信息。例如,如果表 A 有 40 个统计信息,我必须将其分解为 2 个更新统计信息语句。这是因为其中一些表非常大,并且我正在处理的应用程序在数据库调用时超时。
我一直在尝试并行化这个过程。首先,我尝试为每个块创建最多 20 个统计表的作业,并使用parallel.foreach
. 但是我注意到即使我设置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 是否更有意义,以及构建这些查询以提高性能的最佳方式。