优化Microsoft Dynamics AX 2012和365 FO的性能。使用计划指南进行繁重的查询

在我们看来,在这篇文章中,我们想谈谈一种对Axapta数据库进行优化查询的不受欢迎的很少使用的方法-计划指南。简而言之,实际上,它是一种“提示” SQL优化器到正确查询计划的机制。在某些情况下,使用它可能是合理的,有时甚至是唯一可能的使用。



你好!



在一系列的帖子中,我们希望分享我们在MS Dynamics AX系列(以前称为Axapta)的系统开发和操作中的经验。



关于我们



我们是一家相对年轻的杂货超市“ Da!”的零售连锁店。在撰写本文时,我们有100多家商店。该公司运营活动的主要流程在一组MS Dynamics Ax 2012 + MS Dynamics 365 FO系统中实现了自动化。系统运行24/7。每天平均大约有100万条收货线和7万条装配订单线通过该系统。



计划指南







性能调整Axapts可以通过不同的方式完成。当然,最有效的方法是优化应用程序源代码。但是在某些情况下这是有问题的。然后,您可以使用MS SQL Server DBMS提供的工具。它被称为-计划指南。出现在SQL Server 2005版本中。但是根据我们在Axapters社区中的感受(尤其是如果该公司没有专业的DBA),他并不总是被人们所熟知和使用。尽管在某些情况下,其使用可能非常有效。



做什么的?



这是您应使用此工具的主要原因:



1.查询参数中的数据不一致。同一采样标准(字段集)的采样结果(记录数)根据采样标准中变量的值而有所不同。或者,以一种更简单的方式,当对不同输入参数的相同查询导致记录的数量根本不同时(有时一个,有时一万)。这是由于请求参数的所谓“嗅探”。在查询掩码下一次创建查询计划后,再从缓存中获取。没有看这些相同参数的值。



对于涉及InventSum和InventDim表的查询,通常是这种情况。例如,在分析中,只有一个方参加某项nomenklatura,而另一方参加几千。对数据库的第一个请求可以针对禁用了批次记帐的项目进行。优化器将为此构建查询计划。并将其放入缓存中。对数据库的下一个请求可以通过启用了批次记帐的项目。并在InventSum和InventDim的选择中给出数千条记录。对于这样的样本,来自缓存的计划将不是最佳的。



解决此问题的一种方法是在请求正文中使用forceLiterals提示。这表示SQL引擎每次都生成一个新的查询计划。但这给CPU带来了额外的实际负担。对于相同的剩余请求,使用InventDim是不可接受的选项。好吧,您需要了解SQL Server优化器不是完美的,有时,即使具有完整的统计信息,也会生成奇怪的计划。



在这种情况下,可以使用“计划指南”,您可以借助它选择一个查询计划,该计划对于任何查询输入参数都可以提供可接受的执行速度。并使用“计划指南”将此计划附加到查询掩码。



2.优化器选择一个导致长时间锁定的索引。使用计划指南,您可以“钉牢”特定索引的使用,这将缩小样本范围并减少锁的数量。



3.无法快速确定有问题的请求的源(代码中的位置),并且必须立即解决数据库性能下降的问题。



4.由于某些原因(伙伴解决方案,来自内核的请求等),无法更改应用程序源代码。对于禁止重叠的D365尤其如此。



怎么样?



我不会详细描述创建计划指南的分步指南。供应商的网站上有很好的描述(我们对计划的类型-SQL感兴趣),并且网上有大量的教程。



但是重要的是要知道,如果您需要创建新的《计划指南》,那么还有另一种SQL Server工具将对您有很大的帮助。它称为查询存储。出现在2016年。在这里对其进行详细说明



该工具的主要思想是,除了缓存中当前的查询计划外,它还存储优化程序在给定时间内生成的计划的整个历史记录。如果您知道有问题的功能以前“正常”运行过。没有放慢脚步。您只需要在存储库中找到所需的计划并根据该计划制定计划指南即可。不幸的是,由于Axapta的特殊性,不可能通过一个“强制计划”按钮来创建计划指南。您将必须从存储库中复制查询计划并手动创建计划指南。但这仍然大大简化了任务。



还应该记住,查询存储的使用给使用的DBMS服务器的计算资源带来了很小的开销。但是在我们的实践中,它们是微不足道的,可以忽略不计。



示例



这是我们真实战斗基地中的几个计划指南示例。请注意,这些只是与我们特定业务流程相关的示例。它们可能不适用,甚至对您的安装有害。



1. InventSum



本计划指南解决了在InventDim表中查询记录较少的项目时,计划不理想的问题。使用本指南,您始终可以将最佳计划用于大量InventDim SKU组合的采样。 SKU数量少的商品的查询会稍微慢一些。但这对于为输入参数的任何组合提供稳定且可预测的速度付出的代价不是很大。



这些查询主要由InventSum :: findSum()方法生成。并且根据分组,查询模式可能会略有不同。因此,实际上,我们有更多类似的计划指南适用于不同的分组。



2. InventSumDelta



本计划指南允许您为InventSumDelta表建立最佳查询计划,避免对该表进行不必要的锁定。该表的特殊性在于不会在其中存储数据。但是它们非常密集地添加/删除。它实质上是一个信号量表。在这方面,不可能在此表上收集正常统计信息。因此,优化器有时会生成次优计划,从而导致阻塞。



有点离题-您还需要禁用此表的索引上的页锁。由于从该表中进行的选择始终是由唯一的ID进行的,因此将锁升级到页面级别是没有意义的,甚至有害。



结论



但是在一般情况下,让我再次引起您的注意,您不应滥用此工具。如果以最佳方式编写代码,定期更新统计信息,索引不是很零散-大多数情况下,优化器将自行选择正确的计划。但是,如果配置了计划指南,则请求的输入标准可能会落空,从而只会损害计划指南。



All Articles