SQL Server - лучший подход для поиска между двумя датами - PullRequest
0 голосов
/ 02 ноября 2011

Здравствуйте и спасибо заранее за то, что взглянули на это.

Я обнаружил проблему в 45 хранимых процедурах, которые кто-то написал, она отметила, что производительность значительно снизилась. Я посмотрел и обнаружил проблему примерно через 5 минут, запустил тест и перешел с 60 секунд до 4 секунд для одного из 45. Индекс не использовался, и сканирование таблицы происходило на столе с 10 миллионами +. записей. Это использует SQL Server 2005.

Таблица представляет собой журнал аудита и запрашивается хранимым процессом для извлечения updt_tmstmp, когда запись имеет определенное значение. Я изменил приведенный ниже блок кода, чтобы использовать операторы «NOT IN» и «8» product_code <> 'XX' », изменил первый Datediff для использования индексированного столбца updt_tmstmp, а также добавил проверку, что AUDIT_LOG.updt_tmstmp> @dtStartDate для достижения увеличение производительности. Я просто чувствую, что это может быть реализовано по-другому (более элегантно). Буду признателен за любые мысли или идеи по улучшению.

WHERE
    PRODUCT.product_code NOT IN ('D01', 'D02', 'D03', 'D04', 'D05', 'D06', 'D07', 'D99') AND
AUDIT_LOG.updt_tmstmp >= @dtStartDate AND
    --Compares that the date entered is between the two date parameters
     (DATEDIFF(dd,GETDATE(),AUDIT_LOG.updt_tmstmp)
      BETWEEN DATEDIFF(dd,GETDATE(),@dtStartDate)
        AND DATEDIFF(dd,GETDATE(),@dtEndDate)) 
    AND AUDIT_LOG.event_id = (SELECT MIN(AUDIT_LOG.event_id)
                FROM L_EVENT_LOG
                              WHERE AUDIT_LOG.transaction_id = PRODUCT.transaction_id AND                                                AUDIT_LOG.queue = 'AP')

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Сравнение с audit_log.updt_tmstmp выглядит немного странно.

AUDIT_LOG.updt_tmstmp >= @dtStartDate AND
    --Compares that the date entered is between the two date parameters
     (DATEDIFF(dd,GETDATE(),AUDIT_LOG.updt_tmstmp)
      BETWEEN DATEDIFF(dd,GETDATE(),@dtStartDate)
        AND DATEDIFF(dd,GETDATE(),@dtEndDate)) 

Полагаю, это будет то же самое.

audit_log.updt_tmstmp >= @dtStartDate and 
audit_log.updt_tmstmp < @dtEndDate

Я понятия не имею, что делать с коррелированнымподзапрос.Он использует поля из внешнего запроса в предложении where и не использует поля из l_event_log.Возможно, вам следует вместо этого переместить предложение where в основной запрос.

Возможно, что-то вроде этого.

where  product.product_code not in ( 'D01', 'D02', 'D03', 'D04',
                                     'D05', 'D06', 'D07', 'D99' ) and 
       audit_log.updt_tmstmp >= @dtStartDate and 
       audit_log.updt_tmstmp < @dtEndDate and
       audit_log.transaction_id = product.transaction_id and 
       audit_log.queue = 'AP' and
       l_event_log.event_id = (select min(audit_log.event_id)
                               from l_event_log)      
1 голос
/ 02 ноября 2011

Я бы скинулся с вызовом GETDATE () три раза.Не уверен, что это оптимизировано, но стоит поместить это в переменную для начала, чтобы посмотреть, поможет ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...