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查詢
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查詢
要添加@Jacob H在他的評論中說的話,有時優化查詢意味着優化表。
您的CustQuotationJour.QuotationDocNum
字段可能採用的格式爲12345678AA
和12345678BB
或其他。
如果這確實是比較的唯一方法,那麼您應該添加一個新列以僅包含您正在比較並添加到索引的12345678
零件。
在AX業務邏輯中,當填充QuotationDocNum
字段時,您只需執行subStr()
即可存儲當時的8個字符。
我很遺憾不能更改表格。 :-(讓我試着創造另一種觀點 – PearlP
謝謝你們,我管理。我剛剛創建了兩個不同的視圖。一個是我將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;
有肯定是一個更好的場比在where子句中以8個字符出串加盟上。那是一個巨大的表現。是否沒有實際的文檔編號或關鍵字段?也只返回必要的列而不是全部(*)是更好的做法。 –
@JacobH不幸的是沒有其他專欄。文檔被存儲在例如Q12345-1,Q12345-2,Q12345-3和我應該總是返回最新的一個。我會嘗試僅返回必要的列。 – PearlP
現在你明白了爲什麼你應該在設計數據模型時遵循[第一範式](https://en.wikipedia.org/wiki/First_normal_form)。您的性能問題是設計錯誤的後果。 –