Самый частоиспользуемый у нас тип отчётов это "Основной отчёт" (в данном случае за сутки)
В последнее время на моей двухмесячной базе этот отчёт стал генерится несколько минут!!!
Начал разбираться:
основной тормоз в этих строках:
Посмотрев дебаг я увидел на каких запросах при создании отчёта висит:
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 раз!
Оптимизация запросов к БД
-
- Сообщения: 55
- Зарегистрирован: Вт авг 16, 2005 11:29
Сравните результаты поиска в случае двух запросов и в случае одного - результаты совпадают ?
Там не все так просто ... нужно найти MIN значение если дата больше 1133038800 и отдельно найти MAX значения если дата меньше 1133125199 т.е. ищем последнее списание до даты начала отчета и первое списание после даты окончания отчета.
Там не все так просто ... нужно найти MIN значение если дата больше 1133038800 и отдельно найти MAX значения если дата меньше 1133125199 т.е. ищем последнее списание до даты начала отчета и первое списание после даты окончания отчета.
-
- Сообщения: 55
- Зарегистрирован: Вт авг 16, 2005 11:29
Вот именно этот вариант рассматривали ... "пожертвовать" информативностью или получить скорость. Есть вариант вынести "галочку" при подготовке общего отчета вида "Выбирать только абонентов со списаниями за указанный период". Устроит ли такой вариант ?AntonLemon писал(а):Если "прижать" discount_date с двух сторон, то мы не получим данные по пользователям, которые НЕ пользовались услугами в указанный период, а значит состояние их счёта не изменилось.
Но это лучше, чем ждать 30 минут пока сгенерится отчёт на двухпроцессорной машинке.
-
- Сообщения: 55
- Зарегистрирован: Вт авг 16, 2005 11:29
Конечно! Только советую сделать наоборот: по умолчанию делать отчёт, как я предложил. Такой отчёт за небольшой период времени будет пару секунд генериться.aospan писал(а):Вот именно этот вариант рассматривали ... "пожертвовать" информативностью или получить скорость. Есть вариант вынести "галочку" при подготовке общего отчета вида "Выбирать только абонентов со списаниями за указанный
период". Устроит ли такой вариант ?
И добавить галочку: "выводить пользователей не пользовавшихся услугами за указанный период". И если кому это надо, тот может поставить галку и подождать пару часиков )