Модераторы: 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   Вверх
pavelv
Дата 23.8.2007, 05:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



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

Не совсем. Я просто не вижу другой альтернативы для действий сервера, конечно сначала он должен найти все записи в запросе, а потом их упорядочивать. Сейчас прочту статью, может станет яснее. Кстати если даже выбросить таблицу "B" из запроса скорость координально не снижается, эдак на 10% помойму. 

Да действительно индексов несколько, а в примере я упорядочиваю по составному индексу из двух полей:

Таблица A:
Код

CREATE TABLE A (
    ID_RAION     INTEGER NOT NULL,
    OBJCT_COD    INTEGER NOT NULL,
    COD_IDENT    STR /* STR = VARCHAR(10) */,
    OBJCT_NAME   VARCHAR(100),
    ADR_COD      INTEGER,
    DOM          VARCHAR(9),
    LUDI         INTEGER,
    DETI         INTEGER,
    MAMA         INTEGER,
    NOSIM        SMALLINT,
    PERS_AL      SMALLINT,
    GAZ          SMALLINT,
    ETAG         SMALLINT,
    CHERDAK      SMALLINT,
    PODVAL       SMALLINT,
    RANK         CHAR(2),
    PCHCOD_RW    SMALLINT,
    RW           INTEGER,
    SDJAV        SMALLINT,
    CH_STROEN    SMALLINT,
    OPO9         CHAR(1),
    WHO_KOR      VARCHAR(25),
    INSPEK       VARCHAR(25),
    RUKOV        VARCHAR(100),
    TELEFON      VARCHAR(50),
    SOBSTV       SMALLINT,
    VEDOM        FLOAT,
    DOM_ALL      SMALLINT,
    DOM_VIS      SMALLINT,
    VAGN         SMALLINT,
    PROCUROR     CHAR(1),
    OGNEST       CHAR(2),
    SOVM_PODV    CHAR(1),
    PODV_PER_SG  CHAR(1),
    ETAG_PER_SG  CHAR(1),
    SOST_PODV    SMALLINT,
    TYP_KROVL    SMALLINT,
    ELSHIT       SMALLINT,
    INFSTROEN    VARCHAR(2000),
    INFORM       VARCHAR(2000),
    ADMRN_COD    INTEGER,
    KVO          SMALLINT,
    ARJ          CHAR(1) DEFAULT 'N',
    ADPI         SMALLINT,
    PKB          SMALLINT,
    CREATE_YEAR  INTEGER,
    DIST_PCH     DECIMAL(15,2),
    COD_ORGANIZ  INTEGER
);


/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/
ALTER TABLE A ADD CONSTRAINT PK_A PRIMARY KEY (ID_RAION, OBJCT_COD);
/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/
CREATE INDEX OBJCT_IDX1 ON A (ADR_COD, DOM);
CREATE INDEX OBJCT_IDX2 ON A (COD_IDENT);
CREATE INDEX OBJCT_IDX3 ON A (OBJCT_NAME);


Вторая таблица мала интересна, ни одного индекса нет...так напишу:
Код

Create Table B(
 COD INTEGER NOT NULL,
 NAME VARCHAR(200),
 штук десять мелких полей(в основном smallint, пару int):
)



Запросе соот-но:
Код

Select A.*, B.name
from A, B
where A.ID_RAION = B.COD
order by A.ADR_COD, DOM

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


Шустрый
*


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

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



Как вариант, попробуй с помощью такой процедуры
Код

CREATE PROCEDURE NEW_PROCEDURE 
returns (
    id_raion integer,
    objct_cod integer,
    cod_ident varchar(10),
    objct_name varchar(100),
    adr_cod integer,
    dom varchar(9),
    name varchar(200))
as
BEGIN
  FOR select A.* from A order by A.adr_cod, A.dom INTO :ID_RAION, :OBJCT_COD, :COD_IDENT, :OBJCT_NAME, :ADR_COD, :DOM DO
    BEGIN
      for select b.name from B where B.cod = :id_raion into :name do
        begin
          SUSPEND;
        end
    END
END


Погоняй эту процедуру, потом попробуй создать индекс на B.cod и попробуй снова (в новом подключении, чтобы индекс "увиделся"   smile ), интересно, будет ли разница на твоих данных.

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


Бывалый
*


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

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



Завтра конечно попробую, только опять же не туда помойму копать начинаем. Я писал, что если даже полностью исключить таблицу B из запроса, тоесть оставить
Код

Select A.*
from A    
order by A.ADR_COD, DOM

 То это работает примерно на 100ms быстрее чем с таблицей B, а без order соот-но время попрежнему в десятки раз сокращается. Завтра попробую вместо A.* записать поля явным образом, путем выбора думаю может найти то которое тянет всё вниз smile.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

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

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

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

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

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

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


 




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


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

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