Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Оптимизация запроса [Firebird 2.0]


Страницы:   1 2

zorik ©   (2008-06-18 14:43:00) 

Помогите оптимизировать View. Суть такова. Есть 2 основные таблицы + справочники. Отношение один ко многим. В реальности в 80-90% случаев получается отношение один к одному, в остальных - 10-20% - одной записи MEZWELLO соответствуют 2-5 записей MEZO

Структура таблици MEZWELLO

CREATE TABLE MEZWELLO (
 ID_MEZWELLO   INTEGER NOT NULL,
 DATE_MEZWELLO TIMESTAMP NOT NULL,
 ID_WELL       INTEGER NOT NULL
);

ALTER TABLE MEZWELLO ADD CONSTRAINT
PK_MEZWELLO
PRIMARY KEY (ID_MEZWELLO);

ALTER TABLE MEZWELLO ADD CONSTRAINT
FK_MEZWELLO_WELL
FOREIGN KEY (ID_WELL) REFERENCES WELL (ID_WELL);


Структура таблици MEZO

CREATE TABLE MEZO (
 ID_MEZO      INTEGER NOT NULL,
 ID_WELL      INTEGER NOT NULL,
 QO_M         DOUBLE PRECISION DEFAULT 0 NOT NULL,
 ID_MEZWELLO  INTEGER
);

ALTER TABLE MEZO ADD CONSTRAINT
PK_MEZO
PRIMARY KEY (ID_MEZO);

ALTER TABLE MEZO ADD CONSTRAINT
FK_MEZO_WELL
FOREIGN KEY (ID_WELL) REFERENCES WELL (ID_WELL);


Структура View

CREATE VIEW EXP_LIST_WELL_W (
 NAME_WELL,
 ZDATE,
 QO_M,
)
AS
select
 well.name_well,
 mezwello.date_mezwello zdate,
 sum(mezo.qo_m) qo_m,
from mezwello
left join mezwello on (mezwello.id_mezwello = mezo.id_mezwello)
left join well on (mezwello.id_well = well.id_well)
group by
 mezwello.date_mezwello,
 mezwello.id_well,
 mezo.id_mezwello,
 well.name_well,
 well.id_well,
 well.sortname_well,
order by
 mezwello.date_mezwello,
 well.sortname_well


zorik   (2008-06-18 17:51:00) [1]

добавил индекс для поля sortname, раньше когда оно было вычислительным. это сделать нельзя было


zorik   (2008-06-18 17:50:00) [2]


> Правильный-Вася   (18.06.08 17:48) [23]

еще не дорос до планов. надо изучать


Правильный-Вася   (2008-06-18 17:48:00) [3]

план запроса у вьюхи посмотри
станет ясно направление движения


zorik   (2008-06-18 17:29:00) [4]

Реализовал тригер, как задумал в [21]:
CREATE TRIGGER TR_SETSORTNAME_BI FOR WELL
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
BEGIN
 new.sortname_well=sortname(new.name_well);
END
;


Дальше буду сам остальные погрешности исправлять.
Спасибо всем!


zorik   (2008-06-18 17:06:00) [5]


> Sergey13 ©   (18.06.08 16:54) [18]
> Если уж это sortname такое важное, то почему бы не сделать
> его НОРМАЛЬНЫМ полем и следить за его изменением с помощью
> тригеров.ИМХО всяко шустрее должно быть.


Интересно можно ли такое реализовать - тригер срабатывает на добавление или изменение и используя функцию из UDF заполняет дополнительное поле. И не надо его будет пересчитывать каждый раз. Добавления проходят крайне редко, да и в таблице WELL всего около 1500 записей


zorik   (2008-06-18 17:02:00) [6]


> Как понимать тебя, Саид? (с) т.Сухов8-)


CREATE VIEW EXP_LIST_WELL_W2 (
 SORTNAME_WELL,
 NAME_WELL,
 ZDATE,
 QO_M
)
AS
select
well.sortname_well,
well.name_well,
mezwello.date_mezwello zdate,
sum(mezo.qo_m) qo_m
from mezo
inner join mezwello on (mezo.id_mezwello = mezwello.id_mezwello)
inner join well on (well.id_well = mezwello.id_well)
group by
well.sortname_well,
well.name_well,
mezwello.date_mezwello


Правильный-Вася   (2008-06-18 16:57:00) [7]


> Как понимать тебя, Саид? (с) т.Сухов

имхо, Абдулла


Sergey13   (2008-06-18 16:54:00) [8]

Если уж это sortname такое важное, то почему бы не сделать его НОРМАЛЬНЫМ полем и следить за его изменением с помощью тригеров.
ИМХО всяко шустрее должно быть.


Правильный-Вася   (2008-06-18 16:53:00) [9]

индекс по калькулируемому полю есть?


Sergey13   (2008-06-18 16:51:00) [10]

> [15] zorik ©   (18.06.08 16:47)
> сортировать надо именно по sortname

> 1. забрал сортировку

Как понимать тебя, Саид? (с) т.Сухов
8-)


zorik   (2008-06-18 16:47:00) [11]


> Sergey13 ©   (18.06.08 16:05) [10]

сортировать надо именно по sortname, а не по name. Когда-то на эту тему был длинный спор, не хочу его поднимать. sortname - стринговое поле, которое формирується в udf на основе поля name

На данный момент ситуация такая:
1. забрал сортировку
2. добавил sortname в вьюху и соответственно поле попало в group by

Результаты:
тестовая вьюшка: Execute: 2 s 781 ms  Fetch: 2 s 781 ms

реальная: Execute: 3 s 16 ms  Fetch: 2 s 953 ms


zorik   (2008-06-18 16:40:00) [12]


> Правильный-Вася   (18.06.08 16:01) [8]
> вот интересно, в первом варианте left [outer] join, а во
> втором inner joinэто че, фиолетово?

с left я протупил


zorik   (2008-06-18 16:35:00) [13]


> Правильный-Вася   (18.06.08 16:06) [12]

согласен, забираю сортировку


Правильный-Вася   (2008-06-18 16:06:00) [14]


> Invalid expression in the ORDER BY clause (not contained
> in either an aggregate function or the GROUP BY clause).

нафига сортировать по полю, которого нет в выборке?
да и сортированная вьюха - фигня какая-то, если понадобится сортировать выборку из нее по-другому, то сервер будет дважды делать бесполезную работу


Sergey13   (2008-06-18 16:06:00) [15]

+ надо ли вообще order by во вьюху совать?


Sergey13   (2008-06-18 16:05:00) [16]

> [7] zorik ©   (18.06.08 16:01)

А так?
CREATE VIEW EXP_LIST_WELL_W2 (
NAME_WELL,
ZDATE,
QO_M
)
AS
select
well.name_well,
mezwello.date_mezwello zdate,
sum(mezo.qo_m) qo_m
from mezwello
inner join mezo on (mezwello.id_mezwello = mezo.id_mezwello)
inner join well on (mezwello.id_well = well.id_well)
group by
mezwello.date_mezwello,
well.name_well,
order by
mezwello.date_mezwello,
well.name_well


zorik   (2008-06-18 16:03:00) [17]

таблица WELL

CREATE TABLE WELL (
 ID_WELL       INTEGER NOT NULL,
 ID_FIELD      INTEGER NOT NULL,
 DESCRIPTION   VARCHAR(200),
 NAME_WELL     VARCHAR(20) NOT NULL,
 UID_WELL      VARCHAR(20),
 OLDID_WELL    VARCHAR(10),
 SORTNAME_WELL COMPUTED BY (sortname(name_well))
);

ALTER TABLE WELL ADD CONSTRAINT
PK_WELL
PRIMARY KEY (ID_WELL);

ALTER TABLE WELL ADD CONSTRAINT
FK_WELL_FIELD
FOREIGN KEY (ID_FIELD) REFERENCES FIELD (ID_FIELD);


Правильный-Вася   (2008-06-18 16:01:00) [18]

вот интересно, в первом варианте left [ outer] join, а во втором innerjoin

это че, фиолетово?


zorik   (2008-06-18 16:01:00) [19]

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the ORDER BY clause (not contained in either an aggregate function or the GROUP BY clause).


Sergey13   (2008-06-18 15:57:00) [20]

> [4] zorik ©   (18.06.08 15:54)
> Ругается без єтого

Я так понял непечатно ругается?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо