Acumatica 优化PXSelect中使用的查询
我有一段代码,当我试图在Azure S2 MSSQL DB上从Acumatica中的一个特定用户执行它时,它会使我的网格超时Acumatica 优化PXSelect中使用的查询,acumatica,Acumatica,我有一段代码,当我试图在Azure S2 MSSQL DB上从Acumatica中的一个特定用户执行它时,它会使我的网格超时 public class CTInquiriesCollecteur : PXGraph<CTInquiriesCollecteur> { [PXFilterable] public PXSelectJoin<POOrder, InnerJoin<Contact,
public class CTInquiriesCollecteur : PXGraph<CTInquiriesCollecteur>
{
[PXFilterable]
public PXSelectJoin<POOrder,
InnerJoin<Contact,
On<Contact.bAccountID, Equal<POOrder.vendorID>>,
InnerJoin<CROpportunity,
On<CROpportunity.opportunityID, Equal<POOrderExt.usrBSD>,Or<CROpportunityExt.usrEBDR,Equal<POOrderExt.usrBRD>>>>>,
Where<Contact.userID, Equal<Current<AccessInfo.userID>>>> poCollecteur;
}
}
Azure S3 MSSQL DB不会超时
public class CTInquiriesCollecteur : PXGraph<CTInquiriesCollecteur>
{
[PXFilterable]
public PXSelectJoin<POOrder,
InnerJoin<Contact,
On<Contact.bAccountID, Equal<POOrder.vendorID>>,
InnerJoin<CROpportunity,
On<CROpportunity.opportunityID, Equal<POOrderExt.usrBSD>,Or<CROpportunityExt.usrEBDR,Equal<POOrderExt.usrBRD>>>>>,
Where<Contact.userID, Equal<Current<AccessInfo.userID>>>> poCollecteur;
}
}
此查询返回所有行(不在contactID上过滤)工作正常(但返回的行数远多于在contactID上过滤的行数):
编辑2:
查看DB for table POOrder,我已经有了一些索引,一个关于主键,一个关于供应商,一个关于NoteID,还有这个奇怪的索引:
CREATE NONCLUSTERED INDEX [nci_wi_POOrder_35EBA31CDEA74D944FD7F833E2CF9116] ON [dbo].[POOrder]
(
[BranchID] ASC,
[CompanyID] ASC,
[UsrBSD] ASC
)
INCLUDE ( [Approved],
[BLOrderNbr],
[BLType],
[Cancelled],
[ControlTotal],
[CreatedByID],
[CreatedByScreenID],
[CreatedDateTime],
[CuryControlTotal],
[CuryDiscTot],
[CuryID],
[CuryInfoID],
[CuryLineTotal],
[CuryOpenLineTotal],
[CuryOpenOrderTotal],
[CuryOpenTaxTotal],
[CuryOrderTotal],
[CuryTaxTotal],
[CuryVatExemptTotal],
[CuryVatTaxableTotal],
[DiscTot],
[DontEmail],
[DontPrint],
[Emailed],
[EmployeeID],
[ExpectedDate],
[ExpirationDate],
[FOBPoint],
[Hold],
[IsOpenTaxValid],
[IsTaxValid],
[LastModifiedByID],
[LastModifiedByScreenID],
[LastModifiedDateTime],
[LineCntr],
[LineTotal],
[NoteID],
[OpenLineTotal],
[OpenOrderQty],
[OpenOrderTotal],
[OpenTaxTotal],
[OrderDate],
[OrderDesc],
[OrderQty],
[OrderTotal],
[OrderVolume],
[OrderWeight],
[OwnerWorkGroupID],
[PrepaymentDocType],
[PrepaymentRefNbr],
[Printed],
[Receipt],
[RemitAddressID],
[RemitContactID],
[RQReqNbr],
[ShipAddressID],
[ShipContactID],
[ShipDestType],
[ShipToBAccountID],
[ShipToLocationID],
[ShipVia],
[SiteID],
[soordernbr],
[soordertype],
[Status],
[TaxTotal],
[TaxZoneID],
[TermsID],
[tstamp],
[UsrBRD],
[UsrCodeMouvement],
[UsrDepartBateauDate],
[UsrFiliere],
[UsrLicenseExport],
[UsrNumeroContainer],
[UsrObservation],
[UsrPAV],
[UsrTypePO],
[VatExemptTotal],
[VatTaxableTotal],
[VendorID],
[VendorLocationID],
[VendorRefNbr]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
我认为这是一个自动生成的索引(可能是由Azure生成的?我在自动调整历史记录中找不到),但我不知道为什么以及是否应该保留它,只在UsrBSD和UserBRD上建立索引?以启用PXGrid的分页,在Aspx中,您至少应该将其
AllowPaging
属性设置为True,或者将属性SkinID
设置为AllowPaging
设置为True(如PrimaryInquire)的一个皮肤。如果有为poCollecteur数据视图定义的委托,那么您还必须遵循下面所示的方法来保留分页,而不是每次从poCollecteur数据视图中选择数据时都从数据库中检索所有记录
public class AccountByPeriodEnq_Extension : PXGraphExtension<AccountByPeriodEnq>
{
[PXFilterable]
public PXSelectOrderBy<GLTranR,
OrderBy<Asc<GLTranR.tranDate,
Asc<GLTranR.refNbr,
Asc<GLTranR.batchNbr,
Asc<GLTranR.module,
Asc<GLTranR.lineNbr>>>>>>> GLTranEnq;
protected IEnumerable glTranEnq()
{
int startRow = PXView.StartRow;
int totalRows = 0;
var result = Base.GLTranEnq.View.Select(PXView.Currents,
PXView.Parameters, PXView.Searches, PXView.SortColumns,
PXView.Descendings, PXView.Filters, ref startRow,
PXView.MaximumRows, ref totalRows);
PXView.StartRow = 0;
return result;
}
}
公共类AccountByPeriodEnq_扩展名:pxGrapherExtension
{
[可过滤]
GLTranEnq发布的公共PXSELECTORDER;
受保护的IEnumerable glTranEnq()
{
int startRow=PXView.startRow;
int totalRows=0;
var结果=Base.GLTranEnq.View.Select(PXView.Currents,
PXView.Parameters,PXView.search,PXView.SortColumns,
PXView.DENATINGS,PXView.Filters,ref startRow,
PXView.MaximumRows,ref totalRows);
PXView.StartRow=0;
返回结果;
}
}
您是否在用户界面的PXGrid中启用了分页功能,以减少从SQL server请求的记录数?对于停用的分页,PXGrid总是从数据库请求所有记录。另一个建议是分析SSMS中第一个查询的执行计划,如果需要,创建一个或多个索引以加快此查询的执行。@RuslanDev感谢您的回答,如何使用分页?我一直在看Acumatica框架指南,我找不到在哪里提到了分页激活或禁用。Regards@Maxime你看过查询计划了吗?我认为您可能需要在usrBSD字段中添加一个索引,在usrEBDR字段中添加另一个索引,以获得最佳性能-在所有情况下,您都应该查看生成的计划@RuslanDev我确实看了一下查询计划,但是我不能很好地利用它,Azure没有给我太多关于创建索引的建议,尽管客户在过去两年中使用了这个基础。感谢您的回答,检查后,allowpaging已经设置为true,并且没有为pocollector委派,这只是一个显示数据的视图,没有涉及逻辑。我将尝试一下索引:)。实际上,数据库中已经有一个包含这两个字段的索引(还有很多其他字段,所以我不知道它是否真的有用)。(我编辑了我的问题)
CREATE NONCLUSTERED INDEX [nci_wi_POOrder_35EBA31CDEA74D944FD7F833E2CF9116] ON [dbo].[POOrder]
(
[BranchID] ASC,
[CompanyID] ASC,
[UsrBSD] ASC
)
INCLUDE ( [Approved],
[BLOrderNbr],
[BLType],
[Cancelled],
[ControlTotal],
[CreatedByID],
[CreatedByScreenID],
[CreatedDateTime],
[CuryControlTotal],
[CuryDiscTot],
[CuryID],
[CuryInfoID],
[CuryLineTotal],
[CuryOpenLineTotal],
[CuryOpenOrderTotal],
[CuryOpenTaxTotal],
[CuryOrderTotal],
[CuryTaxTotal],
[CuryVatExemptTotal],
[CuryVatTaxableTotal],
[DiscTot],
[DontEmail],
[DontPrint],
[Emailed],
[EmployeeID],
[ExpectedDate],
[ExpirationDate],
[FOBPoint],
[Hold],
[IsOpenTaxValid],
[IsTaxValid],
[LastModifiedByID],
[LastModifiedByScreenID],
[LastModifiedDateTime],
[LineCntr],
[LineTotal],
[NoteID],
[OpenLineTotal],
[OpenOrderQty],
[OpenOrderTotal],
[OpenTaxTotal],
[OrderDate],
[OrderDesc],
[OrderQty],
[OrderTotal],
[OrderVolume],
[OrderWeight],
[OwnerWorkGroupID],
[PrepaymentDocType],
[PrepaymentRefNbr],
[Printed],
[Receipt],
[RemitAddressID],
[RemitContactID],
[RQReqNbr],
[ShipAddressID],
[ShipContactID],
[ShipDestType],
[ShipToBAccountID],
[ShipToLocationID],
[ShipVia],
[SiteID],
[soordernbr],
[soordertype],
[Status],
[TaxTotal],
[TaxZoneID],
[TermsID],
[tstamp],
[UsrBRD],
[UsrCodeMouvement],
[UsrDepartBateauDate],
[UsrFiliere],
[UsrLicenseExport],
[UsrNumeroContainer],
[UsrObservation],
[UsrPAV],
[UsrTypePO],
[VatExemptTotal],
[VatTaxableTotal],
[VendorID],
[VendorLocationID],
[VendorRefNbr]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
GO
public class AccountByPeriodEnq_Extension : PXGraphExtension<AccountByPeriodEnq>
{
[PXFilterable]
public PXSelectOrderBy<GLTranR,
OrderBy<Asc<GLTranR.tranDate,
Asc<GLTranR.refNbr,
Asc<GLTranR.batchNbr,
Asc<GLTranR.module,
Asc<GLTranR.lineNbr>>>>>>> GLTranEnq;
protected IEnumerable glTranEnq()
{
int startRow = PXView.StartRow;
int totalRows = 0;
var result = Base.GLTranEnq.View.Select(PXView.Currents,
PXView.Parameters, PXView.Searches, PXView.SortColumns,
PXView.Descendings, PXView.Filters, ref startRow,
PXView.MaximumRows, ref totalRows);
PXView.StartRow = 0;
return result;
}
}