添加外部联接数据源时的表单性能

时间:2012-05-16 09:51:37

标签: dynamics-ax-2009 x++ axapta ax

我有一个自定义表单,其中包含以下数据源设置;

SalesTable
SalesLine (SalesTable - Inner Join)
InventTable (SalesLine - Inner Join)
InventDim (SalesLine - Inner Join)

...没有任何性能问题。

当我添加以下内容时;

InventHazardousGroup (InventTable - Outer Join)

...我发现在我们的开发环境中没有性能问题,但是在生产环境中查询非常慢,这意味着表单需要很长时间才能加载。

SQL语句跟踪日志在两个环境中都生成了以下输出;

(我已经用等等结束了字段列表,因为它很长);

SELECT A.SALESID,A.SALESNAME,A.RESERVATION,A.CUSTACCOUNT,A.INVOICEACCOUNT,A.DELIVERYDATE,A.DELIVERYADDRESS,A.URL,A.PURCHORDERFORMNUM,A.SALESTAKER,A.SALESGROUP,A.FREIGHTSLIPTYPE,A.DOCUMENTSTATUS,A.INTERCOMPANYORIGINALSALESID,etc
FROM  {OJ INVENTTABLE C LEFT OUTER JOIN INVENTHAZARDOUSGROUP E ON ((E.DATAAREAID=?)
AND (C.HAZARDOUSGROUPID=E.HAZARDOUSGROUPID))},SALESTABLE A,SALESLINE B,INVENTDIM D
WHERE ((A.DATAAREAID=?)
AND (A.SALESTYPE=?))
AND ((B.DATAAREAID=?)
AND (A.SALESID=B.SALESID))
AND ((C.DATAAREAID=?)
AND (B.ITEMID=C.ITEMID))
AND ((D.DATAAREAID=?)
AND (B.INVENTDIMID=D.INVENTDIMID))
ORDER BY A.DATAAREAID,A.SALESID OPTION(FAST 1)

有什么理由说这在一个环境中应该如此缓慢而在另一个环境中却不是这么慢?我在开发环境中测试的数据是最近的,大约1个月大。我在生产环境中,在另一家公司中遇到了相同的性能问题。

4 个答案:

答案 0 :(得分:2)

之前我已经解决了这个问题,我认为它与外部联接没有任何关系。这很可能是因为表单在生产与开发中生成的查询数量。 SQL尝试在使用查询时缓存查询,并且AX喜欢将对象作为变量传递给SQL。最有可能的是,您在生产中有一个错误的缓存计划,然后被所有用户使用。我建议使用Force Literals。我在一些地方很少使用它,它对性能产生了重大影响。

答案 1 :(得分:1)

检查SQL Server中是否存在AX中的索引。

答案 2 :(得分:0)

检查查询的执行计划。

最简单的方法是登录到infolog(在“用户设置”的“SQL”选项卡上设置长查询),然后双击有问题的查询。

否则尝试重建表和create statistics表。

答案 3 :(得分:0)

您在开发中运行的SQL服务器版本以及生产中的版本。执行DBCC TRACESTATUS(-1);以确定dev与prod中的标志。确保它们没有区别。我已经看到了问题,当他们这样做时,性能问题出现在一个,而不是另一个。

查询总是在生产中运行缓慢,还是仅仅运行缓慢?