powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите составить запрос, чтобы ну очень быстро работало
5 сообщений из 5, страница 1 из 1
Помогите составить запрос, чтобы ну очень быстро работало
    #39372340
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Уважаемые коллеги, наставьте на путь истинный?
Вводные:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE TCATALOG (
    ID             INTEGER NOT NULL,
    IDTYPE         INTEGER,
    STATUS         SMALLINT DEFAULT 0,
    YEAR_REL       DATE,
...

CREATE INDEX TCATALOG_IDX_IDTYPE ON TCATALOG (IDTYPE);
CREATE INDEX TCATALOG_IDX_YEARRELEASE ON TCATALOG (YEAR_REL);
...

CREATE TABLE SPPUBLTYPES (
    ID        INTEGER NOT NULL,
...
    IDORD     INTEGER);


Программа для библиотеки.
TCATALOG - таблица публикаций, знает "тип" публикации (IDTYPE) и дату выхода (YEAR_REL)
SPPUBLTYPES - таблица видов публикаций.
Когда пользователь получает список-результат через фильтр, он должен получить 2 таблицы - одну список, и вторую - сводные данные, в виде:

Код: sql
1.
2.
3.
4.
ГОД/ВИД  Учебник | Учебное пособие | Статья из журнала .... (на сейчас тут 15 видов)
2011         68             43                        0             ...
2012         72             28                        2             ...
2013         57             35                        15           ...


Что я попробовал сделать:
Код: sql
1.
2.
3.
select distinct EXTRACT(YEAR from c.YEAR_REL) as THEYEAR
from TCATALOG c
order by EXTRACT(YEAR from c2.YEAR_REL)

- отдельно работает быстро, 900мс все записи (всего на данный момент зарегистрировано 100к публикаций), результат - 79 уникальных лет

Код: sql
1.
2.
3.
4.
select EXTRACT(YEAR from c2.YEAR_REL) as Y, count(c2.ID) as CC from TCATALOG c2
where (c2.STATUS=1) and c2.IDTYPE=1
group by EXTRACT(YEAR from c2.YEAR_REL)
order by EXTRACT(YEAR from c2.YEAR_REL)

- такое выдает за 1.1сек все записи (те же 79 строк).

Но когда пытаюсь это все собрать воедино:
так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select distinct EXTRACT(YEAR from c.YEAR_REL) as THEYEAR
, LJ1.CC as FLD1
from TCATALOG c
left join (select count(c2.ID) as CC, EXTRACT(YEAR from c2.YEAR_REL) as Y from TCATALOG c2
where (c2.STATUS=1) and c2.IDTYPE=1
group by EXTRACT(YEAR from c2.YEAR_REL)) LJ1 on LJ1.Y = EXTRACT(YEAR from c.YEAR_REL)
order by EXTRACT(YEAR from c.YEAR_REL)


или так:
Код: sql
1.
2.
3.
4.
5.
select distinct EXTRACT(YEAR from c.YEAR_REL) as THEYEAR
,(select count(c2.ID) as CC from TCATALOG c2
where (c2.STATUS=1) and c2.IDTYPE=1 and EXTRACT(YEAR from c2.YEAR_REL)=EXTRACT(YEAR from c.YEAR_REL)) as CC1
from TCATALOG c
order by EXTRACT(YEAR from c.YEAR_REL)


то результата просто не дождался, останавливал сервер.
Если в первом запрос поменять left join на inner join, то работает, но так нельзя, т.к. при некоторых условиях фильтра (запросы упростил) не во всех годах будут найдены публикации.

Т.к. шапка отчета (виды публикаций) будет менятся, запрос требуется собирать он-лайн.
Это не проблема, заработало бы хотя бы с одним видом.
Можете подсказать, что еще попробовать?
...
Рейтинг: 0 / 0
Помогите составить запрос, чтобы ну очень быстро работало
    #39372344
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,
не удивительно у тебя здесь MERGE JOIN вылазит

RTFM CASE
...
Рейтинг: 0 / 0
Помогите составить запрос, чтобы ну очень быстро работало
    #39372347
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис, я вас не понял (
слово MERGE в плане не видно. И я туплю - как мне может помочь CASE?
...
Рейтинг: 0 / 0
Помогите составить запрос, чтобы ну очень быстро работало
    #39372349
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Devillio,

ах... у тебя же LEFT JOIN ну тогда труба, там вообще только методом NESTED LOOP соединение будет.

я же сказал CASE
Код: sql
1.
2.
3.
4.
select EXTRACT(YEAR from c.YEAR_REL) as THEYEAR,
         SUM(CASE WHEN c.STATUS=1 and c.IDTYPE=1 THEN 1 END) AS CC
from TCATALOG c
order by EXTRACT(YEAR from c.YEAR_REL)
...
Рейтинг: 0 / 0
Помогите составить запрос, чтобы ну очень быстро работало
    #39372354
Devillio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис, блин, я тукан ппц )
Благодарю бесконечно!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите составить запрос, чтобы ну очень быстро работало
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]