Acumatica 优化PXSelect中使用的查询

Acumatica 优化PXSelect中使用的查询,acumatica,Acumatica,我有一段代码,当我试图在Azure S2 MSSQL DB上从Acumatica中的一个特定用户执行它时,它会使我的网格超时 public class CTInquiriesCollecteur : PXGraph<CTInquiriesCollecteur> { [PXFilterable] public PXSelectJoin<POOrder, InnerJoin<Contact,

我有一段代码,当我试图在Azure S2 MSSQL DB上从Acumatica中的一个特定用户执行它时,它会使我的网格超时

  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;
    }
}