Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Оптимизатор FB3. Вычисление min/max / 5 сообщений из 5, страница 1 из 1
15.05.2014, 11:23:49
    #38641956
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизатор FB3. Вычисление min/max
В 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
15.05.2014, 13:07:53
    #38642148
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизатор FB3. Вычисление min/max
про min/max никто не просил, вот и не сделали :-)
...
Рейтинг: 0 / 0
15.05.2014, 13:22:17
    #38642169
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизатор FB3. Вычисление min/max
dimitr,

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

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

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


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