Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Резкое возрастание времени выполнения запроса 
:(
    Опции темы
solenko
Дата 5.7.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 4
Всего: 67



Здравствуйте!
Есть запрос:
Код

SELECT a.id, a.last_name, a.first_name, a.midle_name,sum(n.nach_sum) - sum(p.pay_sum) as saldo
FROM cb_abonents a, cb_nach n, cb_pays p
WHERE n.abonent_id = a.ID AND p.abonent_id = a.id
AND n.nach_date < '2006-10-10' AND p.pay_date < '2006-10-10'
GROUP BY a.id;

Он выполянется 40 секунд (возвращает 50 записей).
Теперь убираем 3 поля:
Код

SELECT a.id, sum(n.nach_sum) - sum(p.pay_sum) as saldo
FROM cb_abonents a, cb_nach n, cb_pays p
WHERE n.abonent_id = a.ID AND p.abonent_id = a.id
AND n.nach_date < '2006-10-10' AND p.pay_date < '2006-10-10'
GROUP BY a.id;

Теперь запрос, по идее, перебирая тот же объем данных, выполняется за 0,4 секунды.

Подскажите в чем дело? Почему так возрастает время выполнения и как этого избежать? 


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Kesh
Дата 5.7.2006, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



А зачем 
SQL
group by a.id 
 


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
solenko
Дата 5.7.2006, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 4
Всего: 67



Чтобы небыло

ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause 


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
blur
Дата 5.7.2006, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 9.11.2004

Репутация: нет
Всего: 1



Цитата(solenko @ 5.7.2006,  16:38)
Здравствуйте!
Есть запрос:
Код

SELECT a.id, a.last_name, a.first_name, a.midle_name,sum(n.nach_sum) - sum(p.pay_sum) as saldo
FROM cb_abonents a, cb_nach n, cb_pays p
WHERE n.abonent_id = a.ID AND p.abonent_id = a.id
AND n.nach_date < '2006-10-10' AND p.pay_date < '2006-10-10'
GROUP BY a.id;

Он выполянется 40 секунд (возвращает 50 записей).
Теперь убираем 3 поля:
Код

SELECT a.id, sum(n.nach_sum) - sum(p.pay_sum) as saldo
FROM cb_abonents a, cb_nach n, cb_pays p
WHERE n.abonent_id = a.ID AND p.abonent_id = a.id
AND n.nach_date < '2006-10-10' AND p.pay_date < '2006-10-10'
GROUP BY a.id;

Теперь запрос, по идее, перебирая тот же объем данных, выполняется за 0,4 секунды.

Подскажите в чем дело? Почему так возрастает время выполнения и как этого избежать?

Интересно, а как это в списке столбцов могут быть столбцы, которых нету в group by?  smile  
PM MAIL   Вверх
Akina
Дата 5.7.2006, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(solenko @  5.7.2006,  17:38 Найти цитируемый пост)
Почему так возрастает время выполнения и как этого избежать?  

1) Смотрим explain
2) пробуем эти поля отправить в конец запроса, т.е.
Код

SELECT a.id, (sum(n.nach_sum) - sum(p.pay_sum)) as saldo, a.last_name, a.first_name, a.midle_name
FROM cb_abonents a, cb_nach n, cb_pays p
WHERE n.abonent_id = a.id AND p.abonent_id = a.id
AND n.nach_date < '2006-10-10' AND p.pay_date < '2006-10-10'
GROUP BY a.id;

3) пробуем заменить отбор связыванием, т.е.
Код

SELECT a.id, (sum(n.nach_sum) - sum(p.pay_sum)) as saldo, a.last_name, a.first_name, a.midle_name
FROM cb_abonents a
   JOIN cb_nach n
      ON n.abonent_id = a.id
   JOIN cb_pays p
      ON p.abonent_id = a.id
WHERE  n.nach_date < '2006-10-10' AND p.pay_date < '2006-10-10'
GROUP BY a.id;


Цитата(blur @  5.7.2006,  19:03 Найти цитируемый пост)
как это в списке столбцов могут быть столбцы, которых нету в group by?

неявный group by... MySQL это допускает... впрочем, ЭТО вполне может быть причиной тормозов. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.1124 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.