powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / select distinct X from T =vs= select X from T group by X: первое... быстрее! Why ?
7 сообщений из 7, страница 1 из 1
select distinct X from T =vs= select X from T group by X: первое... быстрее! Why ?
    #38649217
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Имеется табличка с именем QDISTR, в ней поле doc_id. Индекса по нему нет.
Вот фрагмент gstat -r -t QDISTR:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
QDISTR (143)
    Primary pointer page: 242, Index root page: 243
    Total formats: 1, used formats: 1
    Average record length: 56.60, total records: 1775329
    Average version length: 0.00, total versions: 0, max versions: 0
    Average fragment length: 20.31, total fragments: 35224, max fragments: 1
    Average unpacked length: 112.00, compression ratio: 1.98
    Pointer pages: 4, data page slots: 13975
    Data pages: 12204, average fill: 67%
    Primary pages: 11202, full pages: 9169, swept pages: 6318
    Fill distribution:
         0 - 19% = 1185
        20 - 39% = 532
        40 - 59% = 612
        60 - 79% = 8724
        80 - 99% = 1151

Есть два запроса, запускались по пять раз каждый:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Database:  localhost/3333:oltp30
SQL> out /dev/null;
SQL> select distinct q.doc_id from qdistr q;
SQL> select distinct q.doc_id from qdistr q;
SQL> select distinct q.doc_id from qdistr q;
SQL> select distinct q.doc_id from qdistr q;
SQL> select distinct q.doc_id from qdistr q;
SQL> select q.doc_id from qdistr q group by q.doc_id;
SQL> select q.doc_id from qdistr q group by q.doc_id;
SQL> select q.doc_id from qdistr q group by q.doc_id;
SQL> select q.doc_id from qdistr q group by q.doc_id;
SQL> select q.doc_id from qdistr q group by q.doc_id;

И вот что вижу в трейсе (конкурир. активности на хосте нету):
Код: 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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
Trace session ID 11 started
2014-05-22T16:17:51.5550 (11623:0x7f9bfed380c8) TRACE_INIT
        SESSION_11


2014-05-22T16:17:54.2030 (11623:0x7f9bfed380c8) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_1053, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:30941
                (TRA_2016004, CONCURRENCY | WAIT | READ_WRITE)

Statement 2760886:
-------------------------------------------------------------------------------
select distinct q.doc_id from qdistr q
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (Q NATURAL)
10074 records fetched
   1934 ms, 3608450 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
QDISTR                            1775329

2014-05-22T16:18:00.2710 (11623:0x7f9bfed380c8) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_1053, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:30941
                (TRA_2016004, CONCURRENCY | WAIT | READ_WRITE)

Statement 2760888:
-------------------------------------------------------------------------------
select distinct q.doc_id from qdistr q
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (Q NATURAL)
10074 records fetched
   1929 ms, 3608450 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
QDISTR                            1775329

2014-05-22T16:18:06.9420 (11623:0x7f9bfed380c8) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_1053, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:30941
                (TRA_2016004, CONCURRENCY | WAIT | READ_WRITE)

Statement 2760889:
-------------------------------------------------------------------------------
select distinct q.doc_id from qdistr q
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (Q NATURAL)
10074 records fetched
   1928 ms, 3608450 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
QDISTR                            1775329

2014-05-22T16:18:12.3660 (11623:0x7f9bfed380c8) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_1053, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:30941
                (TRA_2016004, CONCURRENCY | WAIT | READ_WRITE)

Statement 2760890:
-------------------------------------------------------------------------------
select distinct q.doc_id from qdistr q
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (Q NATURAL)
10074 records fetched
   1928 ms, 3608450 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
QDISTR                            1775329

2014-05-22T16:18:17.0000 (11623:0x7f9bfed380c8) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_1053, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:30941
                (TRA_2016004, CONCURRENCY | WAIT | READ_WRITE)

Statement 2760891:
-------------------------------------------------------------------------------
select distinct q.doc_id from qdistr q
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (Q NATURAL)
10074 records fetched
   1928 ms, 3608450 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
QDISTR                            1775329

2014-05-22T16:18:32.7330 (11623:0x7f9bfed380c8) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_1053, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:30941
                (TRA_2016004, CONCURRENCY | WAIT | READ_WRITE)

Statement 2760892:
-------------------------------------------------------------------------------
select q.doc_id from qdistr q group by q.doc_id
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (Q NATURAL)
10074 records fetched
   2468 ms, 3608450 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
QDISTR                            1775329

2014-05-22T16:18:41.8810 (11623:0x7f9bfed380c8) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_1053, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:30941
                (TRA_2016004, CONCURRENCY | WAIT | READ_WRITE)

Statement 2760893:
-------------------------------------------------------------------------------
select q.doc_id from qdistr q group by q.doc_id
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (Q NATURAL)
10074 records fetched
   2468 ms, 3608450 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
QDISTR                            1775329

2014-05-22T16:18:45.6050 (11623:0x7f9bfed380c8) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_1053, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:30941
                (TRA_2016004, CONCURRENCY | WAIT | READ_WRITE)

Statement 2760894:
-------------------------------------------------------------------------------
select q.doc_id from qdistr q group by q.doc_id
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (Q NATURAL)
10074 records fetched
   2468 ms, 3608450 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
QDISTR                            1775329

2014-05-22T16:18:48.8950 (11623:0x7f9bfed380c8) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_1053, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:30941
                (TRA_2016004, CONCURRENCY | WAIT | READ_WRITE)

Statement 2760895:
-------------------------------------------------------------------------------
select q.doc_id from qdistr q group by q.doc_id
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (Q NATURAL)
10074 records fetched
   2467 ms, 3608450 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
QDISTR                            1775329

2014-05-22T16:18:52.1130 (11623:0x7f9bfed380c8) EXECUTE_STATEMENT_FINISH
        oltp30 (ATT_1053, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        /opt/fb30trnk/bin/isql:30941
                (TRA_2016004, CONCURRENCY | WAIT | READ_WRITE)

Statement 2760896:
-------------------------------------------------------------------------------
select q.doc_id from qdistr q group by q.doc_id
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN SORT (Q NATURAL)
10074 records fetched
   2468 ms, 3608450 fetch(es)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
QDISTR                            1775329

Дифферент = 500 мс. Не в пользу group by. Какая тёмная сила это делает ?
...
Рейтинг: 0 / 0
select distinct X from T =vs= select X from T group by X: первое... быстрее! Why ?
    #38649262
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что ты там такое над табличкой делал что она такая фрагментированная стала?
...
Рейтинг: 0 / 0
select distinct X from T =vs= select X from T group by X: первое... быстрее! Why ?
    #38649301
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

после инсерта в строке может произойти несколько раз апдейт. Удалений нет.
...
Рейтинг: 0 / 0
select distinct X from T =vs= select X from T group by X: первое... быстрее! Why ?
    #38649423
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТаблоидДифферент = 500 мс. Не в пользу group by. Какая тёмная сила это делает ?
set explain; тебе в руки, там видно причину (насколько я помню, это уже обсуждалось)
...
Рейтинг: 0 / 0
select distinct X from T =vs= select X from T group by X: первое... быстрее! Why ?
    #38649448
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrset explain; тебе в руки, там видно причину (насколько я помню, это уже обсуждалось)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQL> set planonly;
SQL> set explain on;
SQL> select distinct q.doc_id from qdistr q;

Select Expression
    ->  Unique Sort  (record length: 32, key length: 12)
        -> Table "Q" Full Scan



SQL> select q.doc_id from qdistr q group by q.doc_id;

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

Я правильно понимать по-русски, что "Aggregate" делает сортировку кортежей (всех полей из from-секции, даже не нужных в итоговой выборке), а затем уже "Select Expression" вытаскивает из отсортированного набора только нужные поля ?
...
Рейтинг: 0 / 0
select distinct X from T =vs= select X from T group by X: первое... быстрее! Why ?
    #38649464
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

дубликатов в поле doc_id много? Если достаточно, то ощути разницу между Sort и Unique Sort.
...
Рейтинг: 0 / 0
select distinct X from T =vs= select X from T group by X: первое... быстрее! Why ?
    #38649496
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrдубликатов в поле doc_id много? Если достаточно, то ощути разницу между Sort и Unique Sort.Да, бубликатов в этом поле очень много.
Код: plaintext
1.
2.
3.
4.
5.
SQL> select count(*), count(distinct doc_id) from qdistr;

                COUNT                 COUNT
===================== =====================
              1775329                 10074
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / select distinct X from T =vs= select X from T group by X: первое... быстрее! Why ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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