2017-07-10 9 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) 
       ) 

こんにちは、 このクエリを最適化するのを手伝ってください。DynamicsでSQLクエリを最適化するAX

+0

where句の部分文字列から8文字を取り出すよりも、必ず結合する方が良いフィールドがあります。そこには大きなパフォーマンスがあります。実際のドキュメント番号やキーフィールドはありませんか?また、すべての列(*)ではなく必要な列だけを返す方が良い方法です。 –

+0

@JacobH残念ながら他の列はありません。 docnumは、例えば、 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フィールドに値が設定されている場合は、そのときに8文字を格納するためにsubStr()を実行するだけです。

+0

残念ながらテーブルを変更することはできません。 :-(。別のビューを作成してみましょう – PearlP

0

ありがとうございました。私はちょうど2つの異なるビューを作成しました1つは、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;