Ищите улучшения производительности подсчета SQL. - PullRequest
1 голос
/ 11 февраля 2010

Я рефакторинг некоторого старого SQL, который борется после 4 лет и 1,7 млн ​​строк данных. Есть ли способ улучшить следующий запрос MS SQL:

SELECT     ServiceGetDayRange_1.[Display Start Date], 
SUM (CASE WHEN Calls.line_date BETWEEN [Start Date] AND [End Date] THEN 1 ELSE 0 END) AS PerDayCount
FROM         dbo.ServiceGetDayRange(GETUTCDATE(), 30, @standardBias, @daylightBias, @DST_startMonth, @DST_endMonth, @DST_startWeek, @DST_endWeek, @DST_startHour, @DST_endHour, @DST_startDayNumber, @DST_endDayNumber) AS ServiceGetDayRange_1 CROSS JOIN
                      (select [line_date] from dbo.l_log where dbo.l_log.line_date > dateadd(day,-31,GETUTCDATE())) as Calls
GROUP BY ServiceGetDayRange_1.[Display Start Date], ServiceGetDayRange_1.[Display End Date]
ORDER BY [Display Start Date]

Подсчитывает записи в журнале за предыдущие 30 дней (функция ServiceGetDayRange возвращает диапазоны детализации таблицы, выровненные по TZ) для построения графика на диаграмме. Бесполезная информация, но я не клиент.

В плане выполнения указано, что 99% времени исполнения используется для подсчета записей ... как и следовало ожидать. Очень небольшая нагрузка при обработке смещений TZ (не более 30 строк).

Глупо я подумал «ах, индексированное представление», но потом понял, что не могу привязаться к функции.

Текущее время выполнения, если 6,25 секунды. Любое улучшение в этом + повтор

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 11 февраля 2010

Это быстрее, если вы превращаете ДЕЛО в ГДЕ?

SELECT     ServiceGetDayRange_1.[Display Start Date], COUNT(*) AS PerDayCount
FROM       dbo.ServiceGetDayRange(GETUTCDATE(), 30, @standardBias, @daylightBias, @DST_startMonth, @DST_endMonth, @DST_startWeek, @DST_endWeek, @DST_startHour, @DST_endHour, @DST_startDayNumber, @DST_endDayNumber) AS ServiceGetDayRange_1 CROSS JOIN
                      (select [line_date] from dbo.l_log where dbo.l_log.line_date > dateadd(day,-31,GETUTCDATE())) as Calls
WHERE Calls.line_date BETWEEN [Start Date] AND [End Date]
GROUP BY ServiceGetDayRange_1.[Display Start Date], ServiceGetDayRange_1.[Display End Date]
ORDER BY [Display Start Date]
0 голосов
/ 11 февраля 2010

6,25 секунд для почти 2-метровых строк - это неплохо ... возможно, попробуйте подсчитать количество допустимых строк (ваш 1/0 условный должен это разрешить), а не сумму значений ... Я думаю, это более эффективно в средах оракула. ​​

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