Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / group by X по *всей* таблице и наличии индекса по X: зачем его юзать? / 9 сообщений из 9, страница 1 из 1
06.04.2014, 02:23:04
    #38606272
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by X по *всей* таблице и наличии индекса по X: зачем его юзать?
DDL:
Код: plaintext
1.
2.
3.
4.
5.
recreate table td(id int primary key, pid int , s01 varchar(16) ); commit;
insert into td select row_number()over(), 1+rand()*49999, left(uuid_to_char(gen_uuid()),16)
from rdb$types,rdb$types,rdb$types rows 1000000;
commit;
create index td_pid_id on td(pid, id); 
commit;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 var-1. 
SQL> set explain on;
SQL> out /dev/null;
SQL> select pid,max(id) from td group by pid;

Select Expression
    -> Aggregate
        -> Table "TD" Access By ID
            -> Index "TD_PID_ID" Full Scan

 var-2. 
SQL> select pid+0 pid, max(id) from td group by pid+0;

Select Expression
    -> Aggregate
        -> Sort (record length: 40, key length: 12)
            -> Table "TD" Full Scan

Статистика по этим вариантам:
Код: 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.
28.
29.
30.
31.
32.
2014-04-06T02:14:26.2540 (6403:0x7f309ceda100) EXECUTE_STATEMENT_FINISH
        sqlex30 (ATT_397, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:361
                (TRA_12824, CONCURRENCY | WAIT | READ_WRITE)

Statement 137:
-------------------------------------------------------------------------------
select pid,max(id) from td group by pid
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (TD ORDER TD_PID_ID)
50000 records fetched
    3712 ms, 893948 read(s), 3002232 fetch(es) 

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
TD                                          1000000                                                           

2014-04-06T02:14:59.5580 (6403:0x7f309ceda100) EXECUTE_STATEMENT_FINISH
        sqlex30 (ATT_397, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:361
                (TRA_12824, CONCURRENCY | WAIT | READ_WRITE)

Statement 138:
-------------------------------------------------------------------------------
select pid+0 pid, max(id) from td group by pid+0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (TD NATURAL)
50000 records fetched
    1694 ms, 18106 read(s), 2036385 fetch(es) 

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
TD                                1000000   

Может, есть таки смысл подправить эвристику для варианта, когда селектятся все строки ?
...
Рейтинг: 0 / 0
07.04.2014, 10:49:33
    #38606957
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by X по *всей* таблице и наличии индекса по X: зачем его юзать?
Не понял, почему именно все строки, если ORDER тут всегда проигрывает.
Кстати, DESC индекс "не подходит".
...
Рейтинг: 0 / 0
07.04.2014, 13:05:48
    #38607153
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by X по *всей* таблице и наличии индекса по X: зачем его юзать?
WildSeryНе понял, почему именно все строки, если ORDER тут всегда проигрывает.
Кстати, DESC индекс "не подходит".Как это "почему именно ВСЕ" ? where-кляузы ведь нет, вот и все .
...
Рейтинг: 0 / 0
07.04.2014, 13:19:12
    #38607172
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by X по *всей* таблице и наличии индекса по X: зачем его юзать?
Таблоид,

И что теперь, описывать отдельно случаи, когда все, а когда не все?
...
Рейтинг: 0 / 0
07.04.2014, 13:25:38
    #38607180
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by X по *всей* таблице и наличии индекса по X: зачем его юзать?
Таблоид,

оно пока и для ORDER BY так

Код: sql
1.
2.
3.
select name
from breed
order by name



Код: plaintext
1.
2.
Select Expression
    -> Table "BREED" Access By ID
        -> Index "UNQ_BREED_NAME" Full Scan

но для соединений нескольких таблиц сейчас оптимизатор может менять порядок соединения

Код: sql
1.
2.
3.
4.
select breed.name
from breed
join departure on breed.code_departure = departure.code_departure
order by breed.name



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Select Expression
    -> Sort (record length: 108, key length: 36)
        ->  Nested Loop Join (inner)
            -> Table "DEPARTURE" Full Scan
            -> Filter
                -> Table "BREED" Access By ID
                    -> Bitmap
                        -> Index "FK_BREED_DEPARTURE" Range Scan (full match)

однако

Код: sql
1.
2.
3.
4.
select departure.name
from breed
join departure on breed.code_departure = departure.code_departure
order by departure.name



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Select Expression
    ->  Nested Loop Join (inner)
        -> Table "DEPARTURE" Access By ID
            -> Index "UNQ_DEPARTURE" Full Scan
        -> Filter
            -> Table "BREED" Access By ID
                -> Bitmap
                    -> Index "FK_BREED_DEPARTURE" Range Scan (full match)

теперь к первому запросу припишем ограничитель ROWS

Код: sql
1.
2.
3.
4.
5.
select breed.name
from breed
join departure on breed.code_departure = departure.code_departure
order by breed.name
rows 1



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Select Expression
    -> First N Records
        ->  Nested Loop Join (inner)
            -> Table "BREED" Access By ID
                -> Index "UNQ_BREED_NAME" Full Scan
            -> Filter
                -> Table "DEPARTURE" Access By ID
                    -> Bitmap
                        -> Index "PK_DEPARTURE" Unique Scan

как видим изменился порядок соединения таблиц и появилась навигация по индексу

к сожалению пока rows просто даёт подсказку что цель оптимизатора изменена, т.к. если написать вот так

Код: sql
1.
2.
3.
4.
5.
select breed.name
from breed
join departure on breed.code_departure = departure.code_departure
order by breed.name
rows 1000000000



то план не меняется, хотя сам запрос возвращает всего 164 записи
...
Рейтинг: 0 / 0
07.04.2014, 13:29:21
    #38607190
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by X по *всей* таблице и наличии индекса по X: зачем его юзать?
Таблоид,

да и ещё одно ORDER BY на сегодняшний день используется во многих приложениях без кляузы ROWS и отрабатывает быстро за счёт возврата только первых записей, если поведение изменить, то многие старые приложения придётся модифицировать. С GROUP BY наверное это не так актуально. Кроме того не забывай что план SORT может быть весьма требователен к памяти
...
Рейтинг: 0 / 0
07.04.2014, 13:38:57
    #38607206
Таблоид
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by X по *всей* таблице и наличии индекса по X: зачем его юзать?
WildSeryИ что теперь, описывать отдельно случаи, когда все, а когда не все?Нет, конечно. Но если есть индекс по группируемому полю и критерий выборки (where) показывает, что, там будут отобраны 90% строк, или этого критерия вообще нет (и наличие индекса, след-но, можно не учитывать) - тогда логичнее натуралом идти. ИМХО.
...
Рейтинг: 0 / 0
07.04.2014, 13:43:59
    #38607212
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by X по *всей* таблице и наличии индекса по X: зачем его юзать?
Таблоид,

я думаю это будет не раньше того момента когда оптимизатор научится оценивать мощность множеств во всех случаях, а не только простых
...
Рейтинг: 0 / 0
07.04.2014, 17:58:12
    #38607575
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
group by X по *всей* таблице и наличии индекса по X: зачем его юзать?
WildSeryИ что теперь, описывать отдельно случаи, когда все, а когда не все?
Distinct у нас по этой же причине перестал использовать план table order index. а вот group by пока нет. Надо какие-то коэффициенты по кардинальности таблиц вводить, что ли.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / group by X по *всей* таблице и наличии индекса по X: зачем его юзать? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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