2017-07-10 40 views
0
SELECT t1.* 
FROM CUSTQUOTATIONJOUR t1 
WHERE t1.RECID = (SELECT top 1 MAX(t2.RECID) 
        FROM CUSTQUOTATIONJOUR t2 
        WHERE substring(t2.QUOTATIONDOCNUM,1,8) = substring(t1.QUOTATIONDOCNUM,1,8) 
       ) 

嗨,夥計, 請幫我優化此查詢。在動態AX中優化SQL查詢

+0

有肯定是一個更好的場比在where子句中以8個字符出串加盟上。那是一個巨大的表現。是否沒有實際的文檔編號或關鍵字段?也只返回必要的列而不是全部(*)是更好的做法。 –

+0

@JacobH不幸的是沒有其他專欄。文檔被存儲在例如Q12345-1,Q12345-2,Q12345-3和我應該總是返回最新的一個。我會嘗試僅返回必要的列。 – PearlP

+0

現在你明白了爲什麼你應該在設計數據模型時遵循[第一範式](https://en.wikipedia.org/wiki/First_normal_form)。您的性能問題是設計錯誤的後果。 –

回答

0

要添加@Jacob H在他的評論中說的話,有時優化查詢意味着優化表。

您的CustQuotationJour.QuotationDocNum字段可能採用的格式爲12345678AA12345678BB或其他。

如果這確實是比較的唯一方法,那麼您應該添加一個新列以僅包含您正在比較並添加到索引的12345678零件。

在AX業務邏輯中,當填充QuotationDocNum字段時,您只需執行subStr()即可存儲當時的8個字符。

+0

我很遺憾不能更改表格。 :-(讓我試着創造另一種觀點 – PearlP

0

謝謝你們,我管理。我剛剛創建了兩個不同的視圖。一個是我將QUOTATIONDOCNUM子字符串,然後是包含最終選擇的其他視圖。看起來這

WITH t2 
AS (
    SELECT [QUOTATIONID] 
     ,[QUOTATIONDATE] 
     ,[SALESID] 
     ,[RESPITEDATE] 
     ,[ORDERACCOUNT] 
     ,[INVOICEACCOUNT] 
     ,[CUSTGROUP] 
     ,[PURCHASEORDER] 
     ,[DELIVERYNAME] 
     ,[CUSTOMERREF] 
     ,[DLVTERM] 
     ,[DLVMODE] 
     ,[PAYMENT] 
     ,[CASHDISCCODE] 
     ,[CASHDISCPERCENT] 
     ,[QTY] 
     ,row_number() OVER (
      PARTITION BY QUOTATIONDOCNUM ORDER BY recid DESC 
      ) AS t1 
    FROM [CUSTQUOTATIONJOUR_vw_revised] 
    ) 
SELECT [QUOTATIONID] 
    ,[QUOTATIONDATE] 
    ,[SALESID] 
    ,[RESPITEDATE] 
    ,[ORDERACCOUNT] 
    ,[INVOICEACCOUNT] 
    ,[CUSTGROUP] 
    ,[PURCHASEORDER] 
    ,[DELIVERYNAME] 
    ,[CUSTOMERREF] 
    ,[DLVTERM] 
    ,[DLVMODE] 
    ,[PAYMENT] 
    ,[CASHDISCCODE] 
    ,[CASHDISCPERCENT] 
    ,[QTY] 
FROM t2 
WHERE t1 = 1;