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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2011, 20:47   #1
Gulik
Холост/Не замужем
Форумчанин
 
Аватар для Gulik
 
Регистрация: 13.11.2007
Сообщений: 283
По умолчанию Ускорение выполнения запроса MySQL

Всем привет.
Есть такой запрос:

Код:
SELECT
  PA.ID,
  PA.OldPACode,
  PA.PACode,
  PA.ID_PropertyKind,
  PA.ID_Street,
  PA.AssertDate,
  PA.FromDate,
  PA.ToDate,
  PA.ID_Employee,
  PA.ID_Terminal,
  PA.OldOwnerCode,
  PA.Home,
  PA.HomeCode,
  PA.Building,
  PA.BuildingCode,
  PA.Doorway,
  PA.Floor,
  PA.Flat,
  PA.FlatCode,
  PA.OwnerCode,
  PA.Suffix,
  PA.ID_Owner,
  CONCAT((SELECT Type FROM Town WHERE (SELECT ID_Town FROM Street WHERE PA.ID_Street = ID) = ID), 
    (SELECT Name FROM Town WHERE (SELECT ID_Town FROM Street WHERE PA.ID_Street = ID) = ID)) as Town,
  (SELECT Code FROM Town WHERE (SELECT ID_Town FROM Street WHERE PA.ID_Street = ID) = ID) as TownCode,
  (SELECT ID_Town FROM Street WHERE PA.ID_Street = ID) as ID_Town,
  CONCAT((SELECT Type FROM Street WHERE PA.ID_Street = ID), 
   (SELECT Nm FROM Street WHERE PA.ID_Street = ID)) as Street,
  (SELECT Code FROM Street WHERE PA.ID_Street = ID) as StreetCode,
  (SELECT Type FROM Owner WHERE PA.ID_Owner = ID) as OwnerType,
  (SELECT ShortName FROM Owner WHERE PA.ID_Owner = ID) as PAOwner,
  (SELECT Name FROM Terminal WHERE PA.ID_Terminal = ID) as Terminal,
  (SELECT TerminalCode FROM Terminal WHERE PA.ID_Terminal = ID) as TerminalCode,
  (SELECT Name FROM PropertyKind WHERE PA.ID_PropertyKind = ID) as PAPropertyKind,
  (SELECT Name FROM Employee WHERE PA.ID_Employee = ID) as Employee
FROM
  PersonalAccount PA
В результате получается более 4000 записей
Но на его выполнение уходит больше минуты
Это строка получена после выполнения запроса (HeidiSQL):
/* 0 rows affected, 4,073 rows found. Duration for 1 query: 1,391 sec. (+ 116,297 sec. network) */
Вопрос как можно ускорить выполнение этого запроса?
При этом использование LIMIT крайне не удобно.
До этого прога была на Access и запрос выполнялся за 1 сек.

Последний раз редактировалось Stilet; 04.09.2011 в 20:51.
Gulik вне форума Ответить с цитированием
Старый 04.09.2011, 20:51   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что этот жуткий запроц делает? (делать должен)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2011, 21:10   #3
Gulik
Холост/Не замужем
Форумчанин
 
Аватар для Gulik
 
Регистрация: 13.11.2007
Сообщений: 283
По умолчанию

Возможно я не понял вопроса, но отвечу как понял.
По сути просто делает выборку из главной таблицы (т.е. список лицевых счетов организации выводит). Но из-за присоединенных таблиц жутко долго выбирает. Если делать выборку по другому то возникают проблемы с редактированием и удалением записей.
Код:
SELECT
  PA.ID,
  PA.OldPACode,
  PA.PACode,
  PA.ID_PropertyKind,
  PA.ID_Street,
  PA.AssertDate,
  PA.FromDate,
  PA.ToDate,
  PA.ID_Employee,
  PA.ID_Terminal,
  PA.OldOwnerCode,
  PA.Home,
  PA.HomeCode,
  PA.Building,
  PA.BuildingCode,
  PA.Doorway,
  PA.Floor,
  PA.Flat,
  PA.FlatCode,
  PA.OwnerCode,
  PA.Suffix,
  PA.ID_Owner,
  E.Name as Employee
FROM
  PersonalAccount PA, Employee E
WHERE
  PA.ID_Employee = E.ID
Gulik вне форума Ответить с цитированием
Старый 04.09.2011, 21:24   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но из-за присоединенных таблиц жутко долго выбирает.
А индексы везде нужные прописаны?
Уже поздно структуру менять?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2011, 21:26   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Конечно не ручаюсь, без отладки тяжело, но если убрать все вложенные запросы (через JOIN) то должно быть существенно быстрей
Код:
SELECT
  PA.ID,
  PA.OldPACode,
  PA.PACode,
  PA.ID_PropertyKind,
  PA.ID_Street,
  PA.AssertDate,
  PA.FromDate,
  PA.ToDate,
  PA.ID_Employee,
  PA.ID_Terminal,
  PA.OldOwnerCode,
  PA.Home,
  PA.HomeCode,
  PA.Building,
  PA.BuildingCode,
  PA.Doorway,
  PA.Floor,
  PA.Flat,
  PA.FlatCode,
  PA.OwnerCode,
  PA.Suffix,
  PA.ID_Owner,
  CONCAT(Tn.Type,Tn.Name) as Town,
  Tn.Code as TownCode,
  St.ID_Town as ID_Town,
  CONCAT(St.Type,St.Nm) as Street,
  St.Code as StreetCode,
  Ow.Type as OwnerType,
  Ow.ShortName as PAOwner,
  Te.Name as Terminal,
  Te.TerminalCode as TerminalCode,
  Pr.Name as PAPropertyKind,
  Em.Name as Employee
FROM
  PersonalAccount PA
    LEFT JOIN PropertyKind Pr ON Pr.ID=PA.ID_PropertyKind
    LEFT JOIN Employee Em ON Em.ID=PA.ID_Employee
    LEFT JOIN Owner Ow ON Ow.ID=PA.ID_Owner
    LEFT JOIN Terminal Te ON Te.ID=PA.ID_Terminal
    LEFT JOIN Street St ON St.ID=PA.ID_Street
    LEFT JOIN Town Tn ON Tn.ID=St.ID_Town
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.09.2011, 22:17   #6
Gulik
Холост/Не замужем
Форумчанин
 
Аватар для Gulik
 
Регистрация: 13.11.2007
Сообщений: 283
По умолчанию

Stilet
Нет, структуру менять не поздно. Спасибо, что напомнил про индексы. Щас буду копать в этом направлении.

Аватар
Да, скорость выполнения запроса увеличилась.
/* 0 rows affected, 4,073 rows found. Duration for 1 query: 6,891 sec. (+ 56,078 sec. network) */
Но все равно минута, это много...

Последний раз редактировалось Gulik; 05.09.2011 в 09:00.
Gulik вне форума Ответить с цитированием
Старый 04.09.2011, 22:46   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Нет, структуру менять не поздно.
Тогда может стоит подумать над новой более оптимальной структурой? Я бы прежде всего об этом задумался.
т.е. какие будут запросы, на считывание с "густой" реляцией или будет постоянная запись-редактирование - структуру нужно строить исходя из ответов на эти вопросы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.09.2011, 08:58   #8
Gulik
Холост/Не замужем
Форумчанин
 
Аватар для Gulik
 
Регистрация: 13.11.2007
Сообщений: 283
По умолчанию

Stilet
Спасибо, за советы, дело было в индексах, в таблице Owner поле ID не содержало индекса, после его установки все залетало.
/* 0 rows affected, 4,073 rows found. Duration for 1 query: 0,021 sec. (+ 0,192 sec. network) */
Да, таблица будет постоянно редактироваться и из всех вариантов запросов этот был самым оптимальным (т.к. в других случаях при сохранении возникали различные ошибки (прим. "Недостаточно сведений для обновления ключевого поля", или удаление записей из присоединенных таблиц)), вот только затормозил

Последний раз редактировалось Gulik; 05.09.2011 в 09:01.
Gulik вне форума Ответить с цитированием
Старый 05.09.2011, 22:16   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и из всех вариантов запросов этот был самым оптимальным
И всетки я бы JOINами решал задачу...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка выполнения запроса Maks57 БД в Delphi 1 01.06.2010 01:12
Ошибка выполнения запроса Maks57 Помощь студентам 0 31.05.2010 23:46
Ошибка выполнения запроса Maks57 Помощь студентам 0 31.05.2010 23:44
Проблема выполнения запроса Рустам PHP 2 31.05.2008 15:15
Ошибка выполнения запроса Квэнди БД в Delphi 1 13.03.2007 23:12