Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / DISTINCT vs GROUP BY and ORDER BY / 5 сообщений из 5, страница 1 из 1
14.03.2008, 12:54
    #35190712
ss25
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT vs GROUP BY and ORDER BY
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
dev=# explain analyze SELECT DISTINCT letter FROM books.books;
                                                   QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
 Unique  (cost= 210 . 81 .. 214 . 98  rows= 33  width= 2 ) (actual time= 2 . 935 .. 3 . 764  rows= 33  loops= 1 )
   ->  Sort  (cost= 210 . 81 .. 212 . 89  rows= 834  width= 2 ) (actual time= 2 . 932 .. 3 . 271  rows= 834  loops= 1 )
         Sort Key: letter
         Sort Method:  quicksort  Memory: 49kB
         ->  Seq Scan on books  (cost= 0 . 00 .. 170 . 34  rows= 834  width= 2 ) (actual time= 0 . 010 .. 0 . 958  rows= 834  loops= 1 )
 Total runtime:  3 . 820  ms
( 6  rows)

dev=# explain analyze SELECT letter FROM books.books GROUP BY  1  ORDER BY  1 ;
                                                   QUERY PLAN
-----------------------------------------------------------------------------------------------------------------
 Sort  (cost= 173 . 59 .. 173 . 67  rows= 33  width= 2 ) (actual time= 1 . 763 .. 1 . 776  rows= 33  loops= 1 )
   Sort Key: letter
   Sort Method:  quicksort  Memory: 18kB
   ->  HashAggregate  (cost= 172 . 43 .. 172 . 76  rows= 33  width= 2 ) (actual time= 1 . 609 .. 1 . 628  rows= 33  loops= 1 )
         ->  Seq Scan on books  (cost= 0 . 00 .. 170 . 34  rows= 834  width= 2 ) (actual time= 0 . 008 .. 0 . 658  rows= 834  loops= 1 )
 Total runtime:  1 . 847  ms
( 6  rows)

Версия PG 8.3(win32).

чет не понимаю Дистинкт теперь еще и сортирует результат да и еще проигрует последнему?

в мане если правильно понял нет такого
авторIf DISTINCT is specified, all duplicate rows are removed from the result set
...
Рейтинг: 0 / 0
14.03.2008, 13:24
    #35190827
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT vs GROUP BY and ORDER BY
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
nalbat=> explain analyze select distinct action from cluman_tasks;
                                                     QUERY PLAN
--------------------------------------------------------------------------------------------------------------------
 Unique  (cost= 1 . 34 .. 1 . 40  rows= 1  width= 8 ) (actual time= 0 . 125 .. 0 . 198  rows= 1  loops= 1 )
   ->  Sort  (cost= 1 . 34 .. 1 . 37  rows= 12  width= 8 ) (actual time= 0 . 120 .. 0 . 155  rows= 17  loops= 1 )
         Sort Key: action
         Sort Method:  quicksort  Memory: 25kB
         ->  Seq Scan on cluman_tasks  (cost= 0 . 00 .. 1 . 12  rows= 12  width= 8 ) (actual time= 0 . 012 .. 0 . 061  rows= 17  loops= 1 )
 Total runtime:  0 . 233  ms
( 6  rows)

nalbat=> set enable_sort to off;
SET
nalbat=> explain analyze select distinct action from cluman_tasks;
                                                                  QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------
 Unique  (cost= 0 . 00 .. 12 . 46  rows= 1  width= 8 ) (actual time= 0 . 036 .. 0 . 124  rows= 1  loops= 1 )
   ->  Index Scan using cluman_tasks_action_key on cluman_tasks  (cost= 0 . 00 .. 12 . 43  rows= 12  width= 8 ) (actual time= 0 . 030 .. 0 . 081  rows= 17  loops= 1 )
 Total runtime:  0 . 162  ms
( 3  rows)

distinct не обязательно сортирует, смотри второй explain. а вот через hash-aggregate похоже не умеет.

> в мане если правильно понял нет такого
> > all duplicate rows are removed

удалять повторяющиеся строки можно разными способами, в том числе используя на промежуточном шаге сортировку
...
Рейтинг: 0 / 0
14.03.2008, 14:24
    #35191053
ss25
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT vs GROUP BY and ORDER BY
изсходя из Вашего сообщения напрашивается вывод, что чтобы избавится от лишней сортировки нужно планер заставить использовать индекс т.к. в индексе уже нужное столбцы отсортированы.

только вот без SET ENABLE_SEQSCAN TO OFF планер не использует индекс

хотя в таблице пока только чуть более 1100 строк и планер предпочитает последовательное сканирование.

Отключение сортировки потом включение тут у меня сомнения поскольку запросы выполняются в скрипте последовательно примерно так.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            [ 0 ] => Query: SELECT * FROM public.sessions WHERE session_id = 'b3ddfc2dad8ea43b7b7c6f91fe21fd57' AND s_end > NOW(); Execution time:  0 . 00650691986084  second.
            [ 1 ] => Query: UPDATE public.sessions SET s_end = (CURRENT_TIMESTAMP::TIMESTAMP +  3600 ::reltime) WHERE id =  56 ; Execution time:  0 . 00565004348755  second.
            [ 2 ] => Query: SELECT DISTINCT letter FROM books.books ORDER BY letter; Execution time:  0 . 0107607841492  second.
            [ 3 ] => Query: SELECT DISTINCT letter FROM books.authors ORDER BY letter; Execution time:  0 . 0074770450592  second.
            [ 4 ] => Query: SELECT DISTINCT letter FROM books.publishings ORDER BY letter; Execution time:  0 . 0022439956665  second.
            [ 5 ] => Query: SELECT DISTINCT letter FROM books.subjects ORDER BY letter; Execution time:  0 . 00220489501953  second.
            [ 6 ] => Query: SELECT id, name, foreword, year, page, isbn13, isbn13::isbn AS isbn FROM books.books WHERE id =  1381 ; Execution time:  0 . 0135941505432  second.
            [ 7 ] => Query: SELECT a.id, a.name FROM books.authors a, books.relation_books_authors ba WHERE a.id=ba.author_id AND ba.book_id =  1381 ; Execution time:  0 . 00358390808105  second.
            [ 8 ] => Query: SELECT p.id, p.name FROM books.publishings p, books.relation_books_publishings bp WHERE p.id=bp.publishing_id AND bp.book_id =  1381 ; Execution time:  0 . 00382518768311  second.
            [ 9 ] => Query: SELECT id, name, page, level FROM books.contents WHERE book_id =  1381  AND lft !=  1  ORDER BY lft; Execution time:  0 . 00597810745239  second.
...
Рейтинг: 0 / 0
14.03.2008, 15:46
    #35191408
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT vs GROUP BY and ORDER BY
ss25изсходя из Вашего сообщения напрашивается вывод, что чтобы избавится от лишней сортировки нужно планер заставить использовать индекс т.к. в индексе уже нужное столбцы отсортированы.наверное да. или изменить запрос на group by, как вы написали в первом сообщении. а вообще вы уверены, что через индекс будет быстрее, чем secscan-ом?

ss25только вот без SET ENABLE_SEQSCAN TO OFF планер не использует индекс

хотя в таблице пока только чуть более 1100 строк и планер предпочитает последовательное сканирование.выбираемый план конечно будет зависеть от кол-ва строк в таблице. для запинывания на нужный план можно попробовать не только команды set enable_*, но подергать настройки *_cost,.. - поищите, это много раз уже обсуждалось здесь, на форуме. но, имхо, простого и надежного способа запинать план нет, хотя бы потому что мы пишем запросы на sql, а не на execution-plan-language.

ss25SELECT DISTINCT letter FROM books.books ORDER BY letter;обсуждали вопрос ускорения подобного запроса, если в books много строк и при этом мало различных значений letter: http://sql.ru/forum/actualthread.aspx?tid=464013#4541958
...
Рейтинг: 0 / 0
14.03.2008, 17:33
    #35191885
ss25
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DISTINCT vs GROUP BY and ORDER BY
Благодарю за помощь.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / DISTINCT vs GROUP BY and ORDER BY / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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