powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 2.5 запрос MAX с группировкой
23 сообщений из 48, страница 2 из 2
Firebird 2.5 запрос MAX с группировкой
    #39598969
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Прибил индекс, результат:

Plan
PLAN SORT ((TBL NATURAL))

------ Performance info ------
Prepare time = 16ms
Execute time = 562ms
Avg fetch time = 562.00 ms
Current memory = 35 662 976
Max memory = 57 806 088
Memory buffers = 2 048
Reads from disk to cache = 934
Writes from cache to disk = 0
Fetches from cache = 771 822
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39598982
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr C,

ну вот. Как видишь быстрее оказалось
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39598998
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Вот результаты запроса, предложенного KreatorXXI:

Plan
PLAN (B ORDER TBL_IDX2 INDEX (TBL_IDX1))
PLAN (A NATURAL)

------ Performance info ------
Prepare time = 15ms
Execute time = 47ms
Avg fetch time = 15.67 ms
Current memory = 35 781 144
Max memory = 57 806 088
Memory buffers = 2 048
Reads from disk to cache = 30
Writes from cache to disk = 0
Fetches from cache = 506
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599002
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr C,

это ты fetchAll не сделал. Запрос KreatorXXI делает совсем дохрена лишнего. Можно считать его вариант извратом :-)
Обрамление внутреннего запроса внешним никогда не даст выигрыша, это нонсенс.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599007
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr C,

у вас там что 3 клиента всего?
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599013
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов ДенисAlexandr C,

у вас там что 3 клиента всего?


число записей таблицы clients << числа записей таблицы tbl.
Ну это и понятно, одно дело таблица справочника клиентов, а другое, например, записи об их заказах.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599014
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvAlexandr C,

это ты fetchAll не сделал. Запрос KreatorXXI делает совсем дохрена лишнего. Можно считать его вариант извратом :-)
Обрамление внутреннего запроса внешним никогда не даст выигрыша, это нонсенс.

Нет, это был fetchAll
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599054
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

забавно, но это воспроизводится

DDL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
recreate table tbl (
  id int not NULL, 
  client_id int,
  tstamp timestamp,
  constraint pk_tbl primary key(id)
);

create descending index idx_tbl_tstamp on tbl(tstamp);
create index idx_client_id on tbl(client_id);

insert into tbl(id, client_id, tstamp)
with recursive r(i) as (
  select 1 from rdb$database
  union all
  select I+1 from r WHERE i<1000
)
select r1.i + 1000 * (r2.i-1) as id,
       mod(r1.i, 3)+1 as client_id,
       r1.i + cast('01.01.2000' as timestamp) as tstamp
from r r1
CROSS join r r2;

commit;




Код: sql
1.
2.
3.
select client_id, max(tstamp) as tstamp
from tbl
group by client_id



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
План
PLAN (TBL ORDER IDX_CLIENT_ID)

Select Expression
    -> Aggregate
        -> Table "TBL" Access By ID
            -> Index "IDX_CLIENT_ID" Full Scan

------ Информация о производительности ------
Время подготовки запроса = 15ms
Время выполнения запроса = 983ms
Среднее время на получение одной записи = 327,67 ms
Current memory = 283 419 496
Max memory = 396 039 160
Memory buffers = 16 384
Reads from disk to cache = 0
Writes from cache to disk = 0
Чтений из кэша = 2 005 024

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t(id) as (
  select 1 from rdb$database
  union all
  select 2 from rdb$database
  union all
  select 3 from rdb$database
)
select id, (select max(tstamp) from tbl where tbl.client_id = t.id) as tstamp
from t



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
План
PLAN (TBL ORDER IDX_TBL_TSTAMP INDEX (IDX_CLIENT_ID))
PLAN (T RDB$DATABASE NATURAL, T RDB$DATABASE NATURAL, T RDB$DATABASE NATURAL)

Select Expression
    -> Singularity Check
        -> Aggregate
            -> Filter
                -> Table "TBL" Access By ID
                    -> Index "IDX_TBL_TSTAMP" Full Scan
                        -> Bitmap
                            -> Index "IDX_CLIENT_ID" Range Scan (full match)
Select Expression
    -> Union
        -> Table "RDB$DATABASE" as "T RDB$DATABASE" Full Scan
        -> Table "RDB$DATABASE" as "T RDB$DATABASE" Full Scan
        -> Table "RDB$DATABASE" as "T RDB$DATABASE" Full Scan

------ Информация о производительности ------
Время подготовки запроса = 0ms
Время выполнения запроса = 78ms
Среднее время на получение одной записи = 26,00 ms
Current memory = 283 419 232
Max memory = 396 039 160
Memory buffers = 16 384
Reads from disk to cache = 0
Writes from cache to disk = 0
Чтений из кэша = 522
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599067
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое впечатление, что каждый в этом топике обсуждает что-то своё.
В итоге всё сводится к отличию планов
PLAN (TBL1 ORDER TBL_IDX1)
PLAN (TBL1 ORDER TBL_IDX1 INDEX (TBL_IDX2))

Сейчас ломать голову не буду, но вроде был более простой способ выбрать второй, чем вложенный запрос.
Или даже PLAN (TBL1 ORDER TBL_IDX1 INDEX (TBL_IDX1)) для одного композита.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599079
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

а не хватается композит в group by + max (даже если он DESC)
И +0 для первого запроса не помогает
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599081
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvAlexandr C,

это ты fetchAll не сделал. Запрос KreatorXXI делает совсем дохрена лишнего. Можно считать его вариант извратом :-)
Обрамление внутреннего запроса внешним никогда не даст выигрыша, это нонсенс.
Ага! Как раз такой случай и есть. Через год у него таблица вырастет в сто раз, а Вы будете советовать ради одной записи лопатить запрос по этой выросшей таблице? Агрегаты посоветуйте ещё. В общем, жизнь иногда далека от теории.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599082
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис,

Вот об этом и речь. Получается простой запрос с группировкой очень неэффективно выполняется.
Мне интересно, это именно ограничение Firebird, или тут проблема в самой постановке задачи.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599113
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr C,

расскажи, как же эффективно выполнять "простой запрос с группировкой" ?
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599114
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr C,

это смотря с какой стороны смотреть. Для группировки известны 2 способа: через сортировку (если можно прочесть в порядке индекса ORDER IDX) и HASH GROUP (это в Firebird не реализовано). Это хорошо работает для любой агрегатной функции.

Когда нет группировки, то MIN и MAX при наличии индекса можно вычислить очень быстро. С другими агрегатами это не прокатит, придётся целиком сканировать таблицу.

Придёт dimitr подскажет возможно ли что-то сделать в оптимизаторе
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599128
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисДля группировки известны 2 способаЕсть ещё, но мне интересно что нам расскажет ТС ;)
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599164
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvladСимонов ДенисДля группировки известны 2 способаЕсть ещё, но мне интересно что нам расскажет ТС ;)
Согласен с Вами, моими знаниями можно только повеселить знающих предмет обсуждения))
Поэтому и надеюсь на совет уважаемого сообщества
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599169
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIу него таблица вырастет в сто раз, а Вы будете советовать ради одной записи лопатить запрос по этой выросшей таблице? Агрегаты посоветуйте ещё.
и посоветую. Зачем заниматься онанизмом, постоянно перечитывая данные, которые увеличиваются с каждым годом?
Ясен пень, что программист на начальном этапе разработки об этом не думает. Но думать-то надо.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599210
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема "быстрой группировки" состоит только в получении всех client_id.
Если есть отдельная таблица, где client_id уникальны - дальше всё просто. Для каждого client_id получить максимальное время уже не проблема.
И хотя в плане пишется PLAN (TBL1 ORDER TBL_IDX1), на самом деле там ещё и INDEX TBL_IDX1, это не простой обход в порядке индекса.

Кстати, max(tstamp) неправильно, поскольку рано или поздно получим 2 записи.
Правильно писать first 1 tstamp ... order by tstamp desc
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599237
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIЧерез год у него таблица вырастет в сто раз, а Вы будете советовать ради одной записи
лопатить запрос по этой выросшей таблице?

А через два года она вырастет в миллион раз и придёт время задуматься "а нужен ли мне этот
запрос вообще". И таки да, тогда придёт время для хранимых агрегатов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599250
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Не в таком простом случае.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599252
Alexandr C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WildSeryПроблема "быстрой группировки" состоит только в получении всех client_id.
Если есть отдельная таблица, где client_id уникальны - дальше всё просто. Для каждого client_id получить максимальное время уже не проблема.
И хотя в плане пишется PLAN (TBL1 ORDER TBL_IDX1), на самом деле там ещё и INDEX TBL_IDX1, это не простой обход в порядке индекса.

Кстати, max(tstamp) неправильно, поскольку рано или поздно получим 2 записи.
Правильно писать first 1 tstamp ... order by tstamp desc

Спасибо. Заменил на first 1 tstamp ... order by tstamp desc
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599255
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

В постановке задачи ТС агрегаты не потребуются. Видно, что max отрабатывается нормально. Например, каждый раз сумму считать - это да, согласен, наступит момент. Не надо из пушки по воробьям лупить.
...
Рейтинг: 0 / 0
Firebird 2.5 запрос MAX с группировкой
    #39599256
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexandr CСпасибо. Заменил на first 1 tstamp ... order by tstamp desc Хотя это я брежу немного, 2 записи это из другой оперы.
Но всё равно, так тоже правильно.
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird 2.5 запрос MAX с группировкой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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