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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как ускорить Select ? 
:(
    Опции темы
deviantik
  Дата 4.9.2010, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Firebird 2.1, через JDBC, использую embedded. 
Подскажите пожалуйста я полный чайник. 
Структура БД:
Код

/******************************************************************************/
/***          Generated by IBExpert 2010.07.13 04.09.2010 21:49:38          ***/
/******************************************************************************/

SET SQL DIALECT 3;

SET NAMES UTF8;

CREATE DATABASE 'C:\Users\Evgen\Desktop\Polis\database\globusdb.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET UTF8;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/



CREATE TABLE AGENT (
    ID          INTEGER NOT NULL,
    FIO         VARCHAR(250) NOT NULL,
    ADDRESS     VARCHAR(250),
    TEL1        VARCHAR(250),
    TEL2        VARCHAR(250),
    CODE        VARCHAR(250) CHARACTER SET NONE,
    CITY        VARCHAR(250) CHARACTER SET NONE,
    ADDITIONAL  VARCHAR(250),
    ISWORKING   SMALLINT,
    PROPISKA    VARCHAR(250),
    PASSPORT    VARCHAR(250)
);


CREATE TABLE POLIS (
    ID           INTEGER NOT NULL,
    NOMER        VARCHAR(20) CHARACTER SET NONE NOT NULL,
    TYPE_ID      INTEGER NOT NULL,
    SERIES_ID    INTEGER,
    RECEIVE      DATE,
    TRANSFER     DATE,
    REALIZATION  DATE,
    AGENT_ID     INTEGER,
    LASTMODIF    DATE,
    STATE        VARCHAR(50)
);


CREATE TABLE POLIS_SERIES (
    ID          INTEGER NOT NULL,
    SERIESNAME  VARCHAR(15),
    TYPEID      INTEGER
);


CREATE TABLE POLIS_TYPES (
    ID        INTEGER NOT NULL,
    TYPENAME  VARCHAR(30) NOT NULL,
    FULLNAME  VARCHAR(250)
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE AGENT ADD CONSTRAINT PK_AGENT PRIMARY KEY (ID);
ALTER TABLE POLIS ADD CONSTRAINT PK_POLIS PRIMARY KEY (ID);
ALTER TABLE POLIS_SERIES ADD CONSTRAINT PK_POLIS_SERIES PRIMARY KEY (ID);
ALTER TABLE POLIS_TYPES ADD CONSTRAINT PK_POLIS_TYPES PRIMARY KEY (ID);


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE DESCENDING INDEX DATE_POL ON POLIS (REALIZATION, TRANSFER, RECEIVE);
CREATE INDEX NOMER_POL ON POLIS (NOMER);



и вот такой запрос в программе выполняется очень долго в чем может быть проблема?
Код

select p.id,
 pt.typename as "Тип",
  ps.seriesname as "Серия",
   p.nomer as "Номер",
   a.fio as "Агент",
    p.receive as "Получено",
    p.transfer as "Передано",
    p.realization as "Реализовано",
     p.lastmodif as "Статус изменен",
      p.state as "Статус"

      from polis p
 left join polis_types pt on  p.type_id = pt.id
 left join polis_series ps on p.series_id = ps.id
 left join agent a on p.agent_id = a.id
 
where p.id>0  and
((p.receive BETWEEN '04.08.2010' and '04.09.2010') OR
(p.transfer BETWEEN '04.08.2010' and '04.09.2010') OR
(p.realization BETWEEN '04.08.2010' and '04.09.2010') OR
(p.lastmodif BETWEEN '04.08.2010' and '04.09.2010')) and
p.state in ( 'Испорчено' , 'Передано' , 'Получено' , 'Реализовано' )


Модератор: зачем такие длинные строки

Это сообщение отредактировал(а) Akella - 5.9.2010, 07:50
PM MAIL   Вверх
Akina
Дата 4.9.2010, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

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



Попробуй все условия убрать в подзапрос.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akella
Дата 5.9.2010, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Попробуй создать индекс на каждое отдельное поле, которое участвует в Where.
И попробуй создать составные индексы, которые участвуют в between

Добавлено через 2 минуты и 3 секунды
Торможения также могут проявляться из-за того, что используешь IN.
Торможения также могут проявляться из-за огромного количества записей.
А также не забывай пересчитывать статистику индексов, если удаляешь, изменяешь или добавляешь большое количество записей.
PM MAIL   Вверх
deviantik
Дата 5.9.2010, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а что нужно использовать вместо in? множество проверок  с OR ?

Это сообщение отредактировал(а) deviantik - 5.9.2010, 11:57
PM MAIL   Вверх
Deniz
Дата 6.9.2010, 05:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



deviantik, не увидел нормальных индексов
p.state в отдельный справочник, а в таблице ссылка (по id int), тогда конструкция in сработает лучше.
Нужно 3 отдельных индекса по p.receive, p.transfer, p.realization, p.lastmodif один составной по ним не нужен, т.к. используется "or"
Не совсем понятно для чего такое условие в where (много or по разным датам), может подумать над логикой?
Цитата(deviantik @  4.9.2010,  23:53 Найти цитируемый пост)
и вот такой запрос в программе выполняется очень долго в чем может быть проблема?
очень долго это сколько? Сколько записей в таблицах?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
okkonst
Дата 6.9.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

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



Цитата(deviantik @ 4.9.2010,  21:53)
и вот такой запрос в программе выполняется очень долго в чем может быть проблема?

Ну, конкретные советы уже дали, я хочу кинуть свои 3 копейки: в IBExpert есть отличная функциональность - поглядеть количество индексированных и не индексированных чтений из таблиц запроса. Эта информация в данном случае является исчерпывающей для анализа: не индексированные чтения заменить на индексированные (проиндексировав соответствующие поля). Но опять же, с умом, думая о смысле индекса по конкретному полю (сильно ли облегчил бы "каталог" информации в этом поле поиск конкретной записи для тебя? Или все равно пришлось бы ручками перебирать половину записей?).  Далее, постараться уменьшить число проходов по таблицам, пусть даже индексированных. Например, в некой таблице 500 записей, а статистика запроса показывает 1500 индексированных чтений из нее. Это означает, что выборка из такой таблицы была произведена многократно, например, из-за того, что она используется в подзапросе. Зачастую, можно изменить логику запроса, переписать его так, чтобы данные выбирались 1 раз.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

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

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

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

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

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

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


 




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


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

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