我们说的是工作流状态机注意到任务 A 已完成所需的时间,从而满足工作流定义中的等待条件,然后创建任务 B。用户 1 将任务 A 标记为完成,并且创建任务 B 需要 2 到 20 分钟。以下是我了解到的情况:
论坛上最常见的解决方案是清理 AsyncOperationBase 表。据说如果此表包含超过 100 万行,性能将受到影响,但我们的表仅包含 22K。
在 CRM 2013 中,MS 创建了一种称为“实时工作流”的新工作流类型。这些工作流没有“在后台运行此工作流”旁边的勾选。我们不能使用它们,因为实时工作流不能有等待条件。在 CRM 2011 中,状态机通常只需几秒钟就能注意到任务完成并创建下一个任务。似乎随着实时的引入,其他类型的工作流甚至进一步“在后台”……对此最中肯的说法来自以下 URL:“通常建议使用后台工作流,因为它们允许系统在服务器上的资源可用时应用它们。这有助于平滑服务器必须完成的工作,并有助于为使用系统的每个人保持最佳性能。缺点是后台工作流定义的操作不是即时的。您无法预测它们何时会被应用,但通常需要几分钟。”
是否有任何可能的解决方案,通过工作流程可以帮助在更短的时间内完成任务 B?
答案1
您的 Microsoft SQL Server 的规格是什么,即 RAM、磁盘和 CPU?您有多少个 Microsoft CRM 用户(包括许可用户和典型的并发用户)?虽然这通常不是导致工作流性能缓慢的因素,但如果 Microsoft CRM 服务器性能不足,也可能会影响工作流的处理速度。Microsoft CRM 服务器的硬件规格是什么(CPU、RAM)?听起来您可能存在 SQL Server 性能问题,但真正的识别方法是通过捕获一些数据并对其进行分析。您应该使用此处提供的 SQL Server PSS Perf Wait Stats 跟踪工具捕获 5-15 分钟的数据 -http://sqlnexus.codeplex.com/wikipage?title=Sql2005PerfStatsScript&referringTitle=Home并可以使用 SQLNexus 进行分析http://sqlnexus.codeplex.com/。通常,会有一些关键的缺失索引,如果将它们添加到 Microsoft CRM 数据库中,将解决大多数性能问题。根据 SQL Server 上的 RAM 以及是否与 Microsoft CRM 和/或其他服务共享,您可能需要考虑将 SQL Server 移动到专用计算机和/或升级其上的 RAM 或磁盘系统以获得更佳性能。
如果您想从已完成的工作流中获取更具体的数字和数据,您可以使用以下 SQL 查询来获取实际处理时间(仅限 CRM OnPremise),该查询针对您的 MSCRM 数据库运行,即 Contoso_MSCRM(如果希望仅查看上述工作流实例,请取消注释并输入工作流名称)。请注意,以下处理时间以分钟为单位。:
SELECT Name, StartedOn, CompletedOn, DateDiff(mi,StartedOn,CompletedOn)as 'Time to Process', RetryCount,Message,ErrorCode,StateCode,StatusCode
FROM AsyncOperationBase WITH (NOLOCK)
WHERE OperationType = 10
AND CompletedOn IS NOT NULL
--AND Name = 'Name of Workflow'
ORDER BY [Time to Process] DESC
您没有我认为的大量 AsyncOperation 记录(约 22,000 条),但在使用上述查询获得一些结果后,您可以使用 KB 968520 中的查询从 AsyncOperationBase 表中删除已完成的工作流作业,http://support.microsoft.com/kb/968520。通常我会在 SQL 作业中将其设置为每晚或每周运行一次,以便它可以在非生产时间运行。