0

パフォーマンスが悪い SQL アドホック クエリがあります。私を助けてください、またはそれを最適化するための提案を教えてください。以下にクエリを示します。

SELECT TOP 20 CustomerPrimaryExtID,
              Max(POSTimeStamp)     AS TransactionDate,
              ExtLocationCode,
              0                     AS RedemptionAmount,
              0                     AS RedemptionCount,
              TerminalNum,
              LogixTransNum,
              POSTransNum           AS TransNum,
              0                     AS DetailRecords,
              CustomerTypeID,
              PresentedCustomerID,
              PresentedCardTypeID,
              HHID,
              Replayed,
              0                     AS TransContext,
              isnull(TransTotal, 0) AS TransTotal
FROM   TransHist AS TH WITH(nolock)
WHERE  ( ( ( CustomerPrimaryExtID IN ( '' )
             AND HHID IS NULL )
            OR HHID = '0000000250000013408'
               AND CustomerTypeID <> 1 )
          OR ( CustomerPrimaryExtID = '0000000250000013408'
               AND CustomerTypeID = 1 ) )
       AND NOT EXISTS (SELECT LogixTransNum
                       FROM   TransRedemptionView AS TR2
                       WHERE  ( ( ( CustomerPrimaryExtID IN ( '' )
                                    AND HHID IS NULL )
                                   OR HHID = '0000000250000013408'
                                      AND CustomerTypeID <> 1 )
                                 OR ( CustomerPrimaryExtID = '0000000250000013408'
                                      AND CustomerTypeID = 1 ) )
                              AND TH.LogixTransNum = TR2.LogixTransNum)
GROUP  BY CustomerPrimaryExtID,
          HHID,
          CustomerTypeID,
          PresentedCustomerID,
          PresentedCardTypeID,
          LogixTransNum,
          POSTransNum,
          TerminalNum,
          ExtLocationCode,
          Replayed,
          TransTotal
ORDER  BY TransactionDate DESC 

ここに画像の説明を入力

4

1 に答える 1

0

TransRedemption の 62% のコストを考えると、CustomerPrimaryExtID、HHID、CustomerTypeID、および LogixTransNum のインデックスが多少は役立つと思います。

次のことも検討できます。

FROM 
    TransHist TH 
LEFT OUTER JOIN
    TransRedemption TR2
    ON TH.LogixTransNum = TR2.LogixTransNum

TransRedemption から返される行数を制限するためにそのビューで何かが行われている場合を除き、サブクエリまたは結合でビューを使用しないでください。

次に削除します。

   AND NOT EXISTS (SELECT LogixTransNum
                   FROM   TransRedemptionView AS TR2
                   WHERE  ( ( ( CustomerPrimaryExtID IN ( '' )
                                AND HHID IS NULL )
                               OR HHID = '0000000250000013408'
                                  AND CustomerTypeID <> 1 )
                             OR ( CustomerPrimaryExtID = '0000000250000013408'
                                  AND CustomerTypeID = 1 ) )
                          AND TH.LogixTransNum = TR2.LogixTransNum)

where句から、と置き換えます

AND TR2.LogixTransNum IS NULL

TransRedemption に多くの列がある場合、結合の結果を次のように制限することができます。

FROM 
    TransHist TH 
LEFT OUTER JOIN
    (
        SELECT 
            LogixTransNum
        FROM
            TransRedemption
    ) TR2
    ON TH.LogixTransNum = TR2.LogixTransNum
于 2013-08-30T04:43:29.190 に答える