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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2015, 08:12   #1
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию Помогите ускорить выполнение запроса Firebird

Здравствуйте, использую БД firebird 2.5, Delphi xe2, fibplus + ehlib
Таблица SALE
Код:
ID(integer) - счетчик ,
TID(integer) - ID товара,
KE(DECIMAL 12,5) - количество,
DOCTYPEID(integer) - ID типа документа,
DOCID(integer) - ID документа,
DDOC(TIMESTAMP) - Дата документа
…
Сейчас в этой таблице около 500 тыс записей и возникла надобность узнавать количество конкретного товара на дату документа.
Я составил запрос
Код:
SELECT 
  S1.ID,
  S1.KE,
  S1.DDOC,
  (SELECT SUM(S2.KE) AS FIELD_1 FROM SALE S2 WHERE S2.TID = :TID AND S2.DDOC <= S1.DDOC) AS OSTATOKNADATU
FROM
  SALE S1
WHERE
  S1.TID = :TID AND 
  S1.DOCTYPEID IN (SELECT DOC.ID FROM DOC)
ORDER BY
  S1.DDOC DESC
Запрос выполняется ОЧЕНЬ долго, не могли бы Вы дать рекомендации по ускорению этого запроса.
P.S. Индексы в таблице SALE по полям : TID,DOCTYPEID, DOCID
tarakan1983 вне форума Ответить с цитированием
Старый 16.10.2015, 08:38   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А так для начала (если ID уникален в DOC)
Код:
FROM
  SALE S1, DOC
WHERE
  S1.TID = :TID AND 
  S1.DOCTYPEID=DOC.ID
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2015, 08:47   #3
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А так для начала (если ID уникален в DOC)
Код:
FROM
  SALE S1, DOC
WHERE
  S1.TID = :TID AND 
  S1.DOCTYPEID=DOC.ID
Даже если так
Код:
SELECT 
  S1.ID,
  S1.KE,
  S1.D,
  (SELECT SUM(S2.KE) AS FIELD_1 FROM SALE S2 WHERE S2.TID = 1005 AND S2.D <= S1.D) AS FIELD_1
FROM
  SALE S1
WHERE 
  S1.TID = 1005 
ORDER BY
  S1.D DESC
Если много записей по товару, то можно пойти на первый этаж, покурить и вернуться, а он будет выполняться
tarakan1983 вне форума Ответить с цитированием
Старый 16.10.2015, 08:53   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Составной индекс по TID,DDOC попробуй добавить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2015, 08:56   #5
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Составной индекс по TID,DDOC попробуй добавить
А те индексы, что есть по этим полям удалить?
tarakan1983 вне форума Ответить с цитированием
Старый 16.10.2015, 09:14   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

По TID вижу, он пожалуй отдельный и не нужен будет. А по DDOC не вижу индексов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.10.2015, 09:34   #7
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
По TID вижу, он пожалуй отдельный и не нужен будет. А по DDOC не вижу индексов
Добавил индекс и DDOC и составной TID,DDOC выполнение последнего указанного запроса сократилось до 12 секунд, можно что то еще сделать?
tarakan1983 вне форума Ответить с цитированием
Старый 16.10.2015, 10:19   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Посмотри EXPLAIN PLAN как я тебе говорил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.10.2015, 10:29   #9
tarakan1983
Форумчанин
 
Аватар для tarakan1983
 
Регистрация: 09.09.2008
Сообщений: 418
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Посмотри EXPLAIN PLAN как я тебе говорил.
Я просто с этой штукой не умею обращаться, у меня есть в менеджере кнопка " план запроса", вот что он показывает
tarakan1983 вне форума Ответить с цитированием
Старый 16.10.2015, 21:57   #10
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,770
По умолчанию

Попробуйте как-нибудь с аналитической функцией записать, у меня под вечер голова уже не соображает. Вроде в Firebird теперь тоже есть аналитические функции. Тут надо писать rows between unbounded preceding and current row.
Vapaamies вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение запроса TIBScript maxwait БД в Delphi 2 08.01.2022 16:06
Ускорить выполнение цикла elen_7C9 Общие вопросы C/C++ 5 21.10.2012 22:06
Можно ли ускорить выполнение этого кода? Velross Помощь студентам 3 07.01.2010 19:37
Можно ли как-то ускорить выполнение этого кода (обработка примечаний)? motorway Microsoft Office Excel 2 23.07.2009 17:06
Как ускорить выполнение макросов tat-besidovska Microsoft Office Excel 1 22.01.2008 12:12