Оптимизация запросов к БД

Технические вопросы по UTM 5.0
Ответить
AntonLemon
Сообщения: 55
Зарегистрирован: Вт авг 16, 2005 11:29

Оптимизация запросов к БД

Сообщение AntonLemon »

Самый частоиспользуемый у нас тип отчётов это "Основной отчёт" (в данном случае за сутки)

В последнее время на моей двухмесячной базе этот отчёт стал генерится несколько минут!!!

Начал разбираться:
основной тормоз в этих строках:

Посмотрев дебаг я увидел на каких запросах при создании отчёта висит:
1) SELECT MIN(id),account_id FROM discount_transactions_all WHERE discount_date >= '1133038800' GROUP BY account_id
2) SELECT MAX(id),account_id FROM discount_transactions_all WHERE discount_date <= '1133125199' GROUP BY account_id

Однако, если дать запрос:
SELECT MIN(id),MAX(id),account_id FROM discount_transactions_all WHERE discount_date >= '1133038800' AND discount_date <= '1133125199'GROUP BY account_id

То время генераци отчёта на моей базе ускорилось в 140 раз!

aospan
NetUP Team
Сообщения: 1639
Зарегистрирован: Чт янв 13, 2005 20:30

Сообщение aospan »

Сравните результаты поиска в случае двух запросов и в случае одного - результаты совпадают ?
Там не все так просто ... нужно найти MIN значение если дата больше 1133038800 и отдельно найти MAX значения если дата меньше 1133125199 т.е. ищем последнее списание до даты начала отчета и первое списание после даты окончания отчета.

AntonLemon
Сообщения: 55
Зарегистрирован: Вт авг 16, 2005 11:29

Сообщение AntonLemon »

Если "прижать" discount_date с двух сторон, то мы не получим данные по пользователям, которые НЕ пользовались услугами в указанный период, а значит состояние их счёта не изменилось.

Но это лучше, чем ждать 30 минут пока сгенерится отчёт на двухпроцессорной машинке.

aospan
NetUP Team
Сообщения: 1639
Зарегистрирован: Чт янв 13, 2005 20:30

Сообщение aospan »

AntonLemon писал(а):Если "прижать" discount_date с двух сторон, то мы не получим данные по пользователям, которые НЕ пользовались услугами в указанный период, а значит состояние их счёта не изменилось.

Но это лучше, чем ждать 30 минут пока сгенерится отчёт на двухпроцессорной машинке.
Вот именно этот вариант рассматривали ... "пожертвовать" информативностью или получить скорость. Есть вариант вынести "галочку" при подготовке общего отчета вида "Выбирать только абонентов со списаниями за указанный период". Устроит ли такой вариант ?

AntonLemon
Сообщения: 55
Зарегистрирован: Вт авг 16, 2005 11:29

Сообщение AntonLemon »

aospan писал(а):Вот именно этот вариант рассматривали ... "пожертвовать" информативностью или получить скорость. Есть вариант вынести "галочку" при подготовке общего отчета вида "Выбирать только абонентов со списаниями за указанный
период". Устроит ли такой вариант ?
Конечно! Только советую сделать наоборот: по умолчанию делать отчёт, как я предложил. Такой отчёт за небольшой период времени будет пару секунд генериться.

И добавить галочку: "выводить пользователей не пользовавшихся услугами за указанный период". И если кому это надо, тот может поставить галку и подождать пару часиков )

Ответить