2013-08-26 6 views
0

У меня есть запрос Sql Ad-hoc, который плохо работает. Пожалуйста, помогите мне или дайте мне некоторые рекомендации по ее оптимизации. Вот ниже запрос:Sql Server 2008 R2 Оптимизация запросов

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 

enter image description here

+0

Возможно, вам не нужно столько столбцов GROUP BY, возможно, вам нужно всего лишь взять последние 20 транзакций ... если да, вы можете использовать номер строки или соединения. – Justin

+0

Сколько строк в этих таблицах? –

+0

Приходите на 62% стоимости в таблице, о которой мы ничего не знаем. Опубликовать представление или преобразовать запрос, чтобы не использовать представление. – Paparazzi

ответ

0

Учитывая 62% стоимости на TransRedemption я думаю, индекс на 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) 

от где п и заменить

AND TR2.LogixTransNum IS NULL 

Если TransRedemption имеет много столбцов, то вы можете ограничить результаты в соединении следующим образом:

FROM 
    TransHist TH 
LEFT OUTER JOIN 
    (
     SELECT 
      LogixTransNum 
     FROM 
      TransRedemption 
    ) TR2 
    ON TH.LogixTransNum = TR2.LogixTransNum 
Смежные вопросы