Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.10.2015, 19:08   #1
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию SQL запрос очень долго выполняется

Доброе время!

Прошу помощи.

Есть две таблицы

вот не полная их структура
Код:
main 
  id
  cid - клиент ID
  regdate - дата регистрации
  money
и

Код:
client
  id (=main.cid)
  name
Нужно вывести список клиентов из таблицы CLIENT
select * from client

нужно по каждому клиенту из полученного списка получить информацию из таблицы MAIN о дате его последнего визита (поле main.regdate)

придумал вот такой запрос
Код:
select client.id, client.card, client.cname, client.ctel, client.refby, refby.id as refby_id, refby.cname as fefby_name, max(m.regdate) as lastvis, m.cid 
from 
client 
LEFT OUTER JOIN 
(select * from client) refby 
    ON client.refby=refby.id 
LEFT OUTER JOIN 
main m 
    ON m.cid=client.id 
group by 
 client.id, client.card, client.cname, client.ctel, client.refby, refby_id, fefby_name, m.cid
Но он ООООООЧень долго выполняется


Помогите его оптимизировать
Yuran вне форума Ответить с цитированием
Старый 07.10.2015, 19:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Как выглядят индексы базы? Проверял EXPLAIN PLAN?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.10.2015, 19:46   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А refby откуда всплыло? О нем до того ни слова. И после того
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.10.2015, 09:43   #4
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Как выглядят индексы базы? Проверял EXPLAIN PLAN?
нет не проверял. Я думаю это происходит из-за функции max()

Запрос построен таким образом что при выполнении основного запроса
SELECT * FROM client
для каждой записи выполняется подзапрос
SELECT max(regdate), cid FROM main WHERE main.cid=client.id

Ну как то так. не точно но принцип такой

Только не пойму как это ускорить

Цитата:
Сообщение от Аватар Посмотреть сообщение
А refby откуда всплыло? О нем до того ни слова. И после того
ну это не важно вообще-то

refby взялся из таблицы main
Вот все ее поля
Код:
mani
----------------------
ID
NOWDATE
CID
REGDATE
REGTIME
REGMAST
REGSRV
DURATION
OPIS
MONEY
FARBA
PAYMENT
SALEOPIS
SALEPRICE
-------------------
main.refby=client.id

Это типа какой клиент кого привел...
Но с этим проблем нет вообще...

Последний раз редактировалось Stilet; 08.10.2015 в 10:53.
Yuran вне форума Ответить с цитированием
Старый 08.10.2015, 09:52   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Код:
select client.id, client.card, client.cname, client.ctel, client.refby
, refby.id as refby_id, refby.cname as fefby_name
, m.lastdate, m.cid 
from client
left join client as refby on client.refby=refby.id 
left join ( select max(regdate) as lastdate, cid 
           from main 
           group by cid  ) as m on m.cid=client.id
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.10.2015 в 09:54.
evg_m вне форума Ответить с цитированием
Старый 08.10.2015, 10:23   #6
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

evg_m
Да ваш запрос самый быстрый.

Сейчас придумал почти тоже самое, только вместо временной таблицы m я создал отдельный view с точно таким же запросом как у Вас.
Однако моя конструкция выполняется за 960ms а Ваша за 740ms.

Вот если бы еще можно было ускорить...

Может в таблице client создать поле lastdate и записывать туда данные?
Но тут придется делать какой-то алгоритм актуализации. Потому как клиент может записаться, в поле client.lastdate попадет значение, а клиент потом выпишется и не придет.

Есть идеи?

Пока пользуюсь Вашим вариантом. Спасибо большое
Yuran вне форума Ответить с цитированием
Старый 08.10.2015, 10:47   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

попробуйте создать (если их нет, конечно)
индексы в таблице MAIN по полям
индекс по cid
индекс по regdate

должно помочь.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.10.2015, 12:12   #8
Yuran
Форумчанин
 
Регистрация: 18.02.2008
Сообщений: 198
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
попробуйте создать (если их нет, конечно)
индексы в таблице MAIN по полям
индекс по cid
индекс по regdate

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

Ув. STILET, Вы наверное это имели в веду в своем первом посте. Я не понял сразу. Спасибо

evg_m, еще раз спасибо за поправленный запрос

Тему можно закрывать
Yuran вне форума Ответить с цитированием
Старый 08.10.2015, 12:25   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Вы наверное это имели в веду в своем первом посте.
Ну да )
Думал ты индексы создал правильные.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.10.2015, 20:54   #10
Wasserman
Пользователь
 
Аватар для Wasserman
 
Регистрация: 07.05.2015
Сообщений: 12
По умолчанию

Какое время выполнения запроса?
Какая именно СУБД?
Где сервер (хостинг, локалхост)

ЗЫ: уже много раз написали. реально зайди в структуру проверь индексы. Первая мысль об этом.
Wasserman вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень долго выполняется curl + https 7in PHP 2 17.07.2015 11:21
Долго выполняется MySQL запрос SeRhy SQL, базы данных 2 13.06.2012 22:40
ADO-MS SQL Не выполняется запрос SELECT Dj_SheLL Помощь студентам 10 23.11.2010 14:17
Очень долго стартует железо Pirotexnik Компьютерное железо 0 29.09.2010 20:14
Не выполняется запрос в SQL ivp88 БД в Delphi 5 17.01.2008 10:30