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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi + InterBase: IbQuery, медленно работает 
:(
    Опции темы
pavelv
Дата 17.8.2007, 05:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Есть запрос в IbQuery, через Fields в него добавлены lookup поля. Всего возвращает около 15 000 записей. Работает довольно долго где-то 3-4 сек, может есть какая-нибудь возможность прогружать его постпенно? Тоесть пусть откроет видимые записи в DBGrid(их там 20 вроде), а остальные продолжает подгружать. Ну понятно, если пользователь будет сразу листать вниз пусть тупит, пока все не загрузит...не возбраняется smile. Думаю в этих компонентах такое нельзя реализовать, может есть какие другие или через возможности SQL такое реализуется.
PM MAIL   Вверх
chand0s
Дата 17.8.2007, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(pavelv @ 17.8.2007,  03:10)
Есть запрос в IbQuery, через Fields в него добавлены lookup поля. Всего возвращает около 15 000 записей. Работает довольно долго где-то 3-4 сек, может есть какая-нибудь возможность прогружать его постпенно? Тоесть пусть откроет видимые записи в DBGrid(их там 20 вроде), а остальные продолжает подгружать. Ну понятно, если пользователь будет сразу листать вниз пусть тупит, пока все не загрузит...не возбраняется smile. Думаю в этих компонентах такое нельзя реализовать, может есть какие другие или через возможности SQL такое реализуется.


Вообще сам IBQuery не фетчит все записи. Фетч можно сделать либо как
Код

IBQuery.Last();

или 
Код

IBQuery.FetchAll();
То есть, если у вас код типа

Код

Trans.StartTransaction();
IBQuery.SQL.Test := 'select * from table_001';
IBQuery.Open();
..........

  То фетч не выполняется. Другое дело, что сам DBGrid может делать фетч. Попробуйте с другим Grid'ом или напишите свой на базе StringGrid.

P.S. Я использую IBQuery + EhLib DB Grid   -  ничего автоматически не фетчится. Попробуйте.
PM MAIL   Вверх
pavelv
Дата 19.8.2007, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Фетч там делается для некоторых целей, но сейчас есть идеи как от него избавиться. Это конечно сэкономит кучу памяти и времени, но запрос все равно будет выполнятся медленно. Когда последний раз боролся с этим запросом, понял что без "order by" работает намного быстрее: 32ms против 1.5s.  Причем пытался делать сортировку по первичному ключу все бестолку...так же медленно, не очень понятно почему? Из идей при первом запуске вообще отказаться от сортировки, не очень удобно но зато быстро smile.
Всегда пользовался DbGrid, но хотел бы узнать в чем  преимущества перед ним у EhLib DB Grid?
PM MAIL   Вверх
Bose
Дата 19.8.2007, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

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



Цитата(pavelv @  19.8.2007,  06:24 Найти цитируемый пост)
Всегда пользовался DbGrid, но хотел бы узнать в чем  преимущества перед ним у EhLib DB Grid?

Почитай здесь


Цитата(pavelv @  19.8.2007,  06:24 Найти цитируемый пост)
 Когда последний раз боролся с этим запросом, понял что без "order by" работает намного быстрее: 32ms против 1.5s.

Очень странно. Такое впечатление что сервер сам еле ворочается.

PM MAIL WWW Skype   Вверх
chand0s
Дата 19.8.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(pavelv @  19.8.2007,  04:24 Найти цитируемый пост)
Когда последний раз боролся с этим запросом, понял что без "order by" работает намного быстрее: 32ms против 1.5s.  Причем пытался делать сортировку по первичному ключу все бестолку...так же медленно, не очень понятно почему?
   Показывай запрос и план.

Цитата(pavelv @  19.8.2007,  04:24 Найти цитируемый пост)
сегда пользовался DbGrid, но хотел бы узнать в чем  преимущества перед ним у EhLib DB Grid? 
  Красивше он.  smile 

PM MAIL   Вверх
pavelv
Дата 20.8.2007, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Запрос банальней не бывает smile. Покажу на примере:
В таблице A примерно 15 000 записей, в B около 100.
Код

select A.*, B.name
from A,B
where A.i='1' and B.COD=A.i
order by A.adr

Пытался делать через Left join, работает ещё медленне поэтому уж лучше так smile.

adr - типа varchar. Убирал его и ставил : order by A.i, по времени выйгрыша не получил...зато без него прямо прогресс на лицо.

P.S> Почитал про EhLib, понравилось. А я эту фигню ручками прописывал обычно smile. Но при закачках написано: EhLib 4.2 Оценочная версия (работает только при запущенном IDE) archive for D5-D9, BCB5-BCB6, BDS2006, Delphi2007. Не понимаю, что такое Оценочная версия и что значит "работает только при запущенном IDE"?

Это сообщение отредактировал(а) pavelv - 20.8.2007, 05:20
PM MAIL   Вверх
ksili
Дата 20.8.2007, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(pavelv @  20.8.2007,  10:13 Найти цитируемый пост)
что такое Оценочная версия и что значит "работает только при запущенном IDE"?

Наверно деньгу платить придётся


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
chand0s
Дата 20.8.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(pavelv @ 20.8.2007,  03:13)
Запрос банальней не бывает smile. Покажу на примере:

План запроса!!! 
Для каких-либо выводов нужен план выполнения запроса. Ну, и версию сервера тоже неплохо услышать.
PM MAIL   Вверх
pavelv
Дата 20.8.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



План запроса, не понимаю что ты имеешь ввиду? Для каких выводов, IbQuery связан с DBGrid, в нем всё и отображается. Версия сервера: FireBird 1.5 SuperServer.
PM MAIL   Вверх
Bose
Дата 20.8.2007, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

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



Цитата(pavelv @  20.8.2007,  05:13 Найти цитируемый пост)
P.S> Почитал про EhLib, понравилось. А я эту фигню ручками прописывал обычно . Но при закачках написано: EhLib 4.2 Оценочная версия (работает только при запущенном IDE) archive for D5-D9, BCB5-BCB6, BDS2006, Delphi2007. Не понимаю, что такое Оценочная версия и что значит "работает только при запущенном IDE"?

Это относится к последней версии. Значит что будет работать, только если программа запущена из Delphi.

А вот версия EhLib 3.6 - бесплатна для жителей бывшего СССР. Подробнее смотри здесь(в самом низу)
PM MAIL WWW Skype   Вверх
chand0s
Дата 20.8.2007, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(pavelv @ 20.8.2007,  15:36)
План запроса, не понимаю что ты имеешь ввиду? Для каких выводов, IbQuery связан с DBGrid, в нем всё и отображается. Версия сервера: FireBird 1.5 SuperServer.

 Скачай IBExpert (около 17 Мб), подключи в нем свою базу и открой SQLEditor. Вставь в верхней половине окна свой запрос и нажми "Execute". В нижней половине окна появятся какие-то данные.  smile Вот эти-то данные хватай и кидай сюда. 




PM MAIL   Вверх
pavelv
Дата 22.8.2007, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Да эксперт то стоит, как же без него родимого. Сортировка ведется по индексируемому полю:
Код

Plan
PLAN SORT (JOIN (B NATURAL,A INDEX (RDB$PRIMARY61,OBJCT_IDX3)))

Adapted Plan
PLAN SORT (JOIN (B NATURAL,A INDEX (PK_OBJCT,OBJCT_IDX3)))

------ Performance info ------
Prepare time = 0ms
Execute time = 3s 578ms
Avg fetch time = 596,33 ms
Current memory = 1 244 618
Max memory = 1 247 054
Memory buffers = 75
Reads from disk to cache = 2 220
Writes from cache to disk = 0
Fetches from cache = 27 433



Тот же запрос выполнил ещё раз(а то совсем долго делался) результат лучше, в дальнейшем такой и оставался:
Код

Plan
PLAN SORT (JOIN (B NATURAL,A INDEX (RDB$PRIMARY61,OBJCT_IDX3)))

Adapted Plan
PLAN SORT (JOIN (B NATURAL,A INDEX (PK_OBJCT,OBJCT_IDX3)))

------ Performance info ------
Prepare time = 0ms
Execute time = 750ms
Avg fetch time = 125,00 ms
Current memory = 1 311 048
Max memory = 1 319 944
Memory buffers = 75
Reads from disk to cache = 2 167
Writes from cache to disk = 0
Fetches from cache = 27 410



Банально убираю из запроса "order by" результат:
Код

Plan
PLAN JOIN (B NATURAL,A INDEX (RDB$PRIMARY61,OBJCT_IDX3))

Adapted Plan
PLAN JOIN (B NATURAL,A INDPlan
PLAN JOIN (B NATURAL,A INDEX (RDB$PRIMARY61,OBJCT_IDX3))

Adapted Plan
PLAN JOIN (B NATURAL,A INDEX (PK_OBJCT,OBJCT_IDX3))

------ Performance info ------
Prepare time = 15ms
Execute time = 16ms
Avg fetch time = 2,67 ms
Current memory = 1 173 254
Max memory = 1 319 944
Memory buffers = 75
Reads from disk to cache = 14
Writes from cache to disk = 0
Fetches from cache = 228
EX (PK_OBJCT,OBJCT_IDX3))


Какие выводы из этого делают для оптимизации запроса не понимаю, если кто пояснит буду признателен.

P.S> За EhLib спасибо, сейчас с этим разберусь ставлю библиотеку и буду менять большую часть компонентов в проекте на либовские smile.

Это сообщение отредактировал(а) pavelv - 22.8.2007, 06:51
PM MAIL   Вверх
Bose
Дата 22.8.2007, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

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



pavelv, по-моему надо создать индекс для A.adr

хотя... это совет "не подумавши"(у меня от жары моск плавится)

Это сообщение отредактировал(а) Bose - 22.8.2007, 17:51
PM MAIL WWW Skype   Вверх
pavelv
Дата 22.8.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Индекс есть.

PM MAIL   Вверх
chand0s
Дата 23.8.2007, 00:02 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Покажи DDL таблицы А (вместе с созданием индексов), почему-то мне кажется что на поле A.i создано два индекса.

По твоему плану видно главное - последовательность действий сервера, а именно:
  1) объединение потоков (данных из таблиц А и В)
  2) сортировка того, что объединили

Теперь понятно откуда задержки?

P.S. Мне уже просто самому интересно стало, если не затруднит приведи полный код создания этих двух таблиц, всех индексов к ним и точный запрос на выборку.

P.P.S. Про планы есть отличная статья, рекомендую.

Это сообщение отредактировал(а) chand0s - 23.8.2007, 00:02
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




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


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

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