powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизатор FB3. Вычисление min/max
5 сообщений из 5, страница 1 из 1
Оптимизатор FB3. Вычисление min/max
    #38641956
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В FB3 оптимизатор научился менять порядок соединения таблиц для использование навигации по индексу. Но почему-то на min/max это не распространилось.

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.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
set AUTODDL on;

create table t1 (
  id int not null
);

create table t2 (
  id int not null,
  t1_id int not null
);

set term ^;

execute block
as
declare i int;
begin
  i = 1;
  while (i <= 100) do
  begin
    insert into t1(id) values(:i);
    i = i + 1;
  end
  i = 1;
  while (i < 1000000) do
  begin
    insert into t2(id, t1_id) values(:i, :i / 100000 + 1);
    i = i + 1;
  end
end^

set term ;^

commit;

alter table t1
add constraint pk_t1 primary key(id);

alter table t2
add constraint pk_t2 primary key(id);

alter table t2
add constraint fk_t2_t1 foreign key(t1_id) references t1(id);



в этом запросе индекс для вычисления min не используется, работает медленно

Код: sql
1.
2.
3.
select min(t1.id)
from t1
join t2 on t1.id = t2.t1_id;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Select Expression
    -> Aggregate
        ->  Nested Loop Join (inner)
            -> Table "T2" Full Scan
            -> Filter
                -> Table "T1" Access By ID
                    -> Bitmap
                        -> Index "PK_T1" Unique Scan

         MIN
============
           1

Current memory = 11621440
Delta memory = 547712
Max memory = 11672536
Elapsed time= 3.302 sec
Buffers = 2048
Reads = 11421
Writes = 0
Fetches = 6026958

а здесь уже используется и работает куда быстрее

Код: sql
1.
2.
3.
select min(t2.id)
from t1
join t2 on t1.id = t2.t1_id;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Select Expression
    -> Aggregate
        ->  Nested Loop Join (inner)
            -> Table "T2" Access By ID
                -> Index "PK_T2" Full Scan
            -> Filter
                -> Table "T1" Access By ID
                    -> Bitmap
                        -> Index "PK_T1" Unique Scan

         MIN
============
           1

Current memory = 11840168
Delta memory = 1672
Max memory = 11872248
Elapsed time= 0.058 sec
Buffers = 2048
Reads = 0
Writes = 0
Fetches = 38

А теперь попробуем выполнить аналогичное через order by ... rows 1

Код: sql
1.
2.
3.
4.
select t1.id
from t1
join t2 on t1.id = t2.t1_id
order by t1.id rows 1;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Select Expression
    -> First N Records
        ->  Nested Loop Join (inner)
            -> Table "T1" Access By ID
                -> Index "PK_T1" Full Scan
            -> Filter
                -> Table "T2" Access By ID
                    -> Bitmap
                        -> Index "FK_T2_T1" Range Scan (full match)

          ID
============
           1

Current memory = 11933608
Delta memory = 52288
Max memory = 11933760
Elapsed time= 0.062 sec
Buffers = 2048
Reads = 0
Writes = 0
Fetches = 137

Код: sql
1.
2.
3.
4.
select t2.id
from t1
join t2 on t1.id = t2.t1_id
order by t2.id rows 1;



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Select Expression
    -> First N Records
        ->  Nested Loop Join (inner)
            -> Table "T2" Access By ID
                -> Index "PK_T2" Full Scan
            -> Filter
                -> Table "T1" Access By ID
                    -> Bitmap
                        -> Index "PK_T1" Unique Scan

          ID
============
           1

Current memory = 11821944
Delta memory = -55840
Max memory = 11995560
Elapsed time= 0.056 sec
Buffers = 2048
Reads = 0
Writes = 0
Fetches = 38

Теперь видим что в обоих случаях происходит навигация по индексу и всё работает быстро.

Видимо есть небольшая недоработка в оптимизаторе
...
Рейтинг: 0 / 0
Оптимизатор FB3. Вычисление min/max
    #38642148
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
про min/max никто не просил, вот и не сделали :-)
...
Рейтинг: 0 / 0
Оптимизатор FB3. Вычисление min/max
    #38642169
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

оставил комментарий в CORE-1482

если надо могу добавить новый тикет в трекер
...
Рейтинг: 0 / 0
Оптимизатор FB3. Вычисление min/max
    #38642184
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше новый тикет, я потом его свяжу с существуюшим
...
Рейтинг: 0 / 0
Оптимизатор FB3. Вычисление min/max
    #38642190
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

создал CORE-4428
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизатор FB3. Вычисление min/max
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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