Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Индекс и сортировка по двум полям / 5 сообщений из 5, страница 1 из 1
01.11.2019, 11:53
    #39884142
_WeSTMan_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс и сортировка по двум полям
Всем привет. Есть запрос, который выполняется очень долго.
Сам запрос:
Код: sql
1.
SELECT ID FROM smev_log ORDER BY LOGDATE DESC, ID ASC LIMIT 150 OFFSET 689113



Его план
Код: sql
1.
2.
3.
4.
5.
6.
7.
"Limit  (cost=2427156.39..2427156.76 rows=150 width=16) (actual time=20279.759..20279.842 rows=150 loops=1)"
"  ->  Sort  (cost=2425433.61..2470694.99 rows=18104552 width=16) (actual time=20012.573..20184.970 rows=689263 loops=1)"
"        Sort Key: logdate DESC, id"
"        Sort Method: top-N heapsort  Memory: 81462kB"
"        ->  Seq Scan on smev_log  (cost=0.00..579249.52 rows=18104552 width=16) (actual time=0.026..7501.096 rows=18104552 loops=1)"
"Planning time: 0.460 ms"
"Execution time: 20282.103 ms"



id - первичный ключ
по колонке logdate построен индекс.

Я попробовал составные индексы между ними - толку 0. Он все равно смотрит всю таблицу. Там 20 млн. записей
Подскажите, пожалуйста, как заставить запрос работать по индексам! Заранее спасибо!
...
Рейтинг: 0 / 0
01.11.2019, 12:55
    #39884209
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс и сортировка по двум полям
_WeSTMan_Всем привет. Есть запрос, который выполняется очень долго.
Сам запрос:
Код: sql
1.
SELECT ID FROM smev_log ORDER BY LOGDATE DESC, ID ASC LIMIT 150 OFFSET 689113



Его план
Код: sql
1.
2.
3.
4.
5.
6.
7.
"Limit  (cost=2427156.39..2427156.76 rows=150 width=16) (actual time=20279.759..20279.842 rows=150 loops=1)"
"  ->  Sort  (cost=2425433.61..2470694.99 rows=18104552 width=16) (actual time=20012.573..20184.970 rows=689263 loops=1)"
"        Sort Key: logdate DESC, id"
"        Sort Method: top-N heapsort  Memory: 81462kB"
"        ->  Seq Scan on smev_log  (cost=0.00..579249.52 rows=18104552 width=16) (actual time=0.026..7501.096 rows=18104552 loops=1)"
"Planning time: 0.460 ms"
"Execution time: 20282.103 ms"



id - первичный ключ
по колонке logdate построен индекс.

Я попробовал составные индексы между ними - толку 0. Он все равно смотрит всю таблицу. Там 20 млн. записей
Подскажите, пожалуйста, как заставить запрос работать по индексам! Заранее спасибо!


1)большие offset никак быстро работать не будут что с ними не делай... потому что всеравно надо перебрать limit+offset записей... т.е. запрос в общем случае эквивалентен limit 700000.

2)для такого order by нужен индекс (log_date DESC, id ASC) составной а вы небось просто делали (log_date, id)
порядок сортировок в индексе должен совпадать с порядком сортировок в order by полностью.
...
Рейтинг: 0 / 0
01.11.2019, 13:05
    #39884220
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс и сортировка по двум полям
Maxim Boguk1)большие offset никак быстро работать не будут что с ними не делай... потому что всеравно надо перебрать limit+offset записей... т.е. запрос в общем случае эквивалентен limit 700000.

2)для такого order by нужен индекс (log_date DESC, id ASC) составной а вы небось просто делали (log_date, id)
порядок сортировок в индексе должен совпадать с порядком сортировок в order by полностью.
1. 700000 << 18 000 000. но да, быстро не будет

2 ... или с полностью инвертированным по всем измерениям ... (if btree)
...
Рейтинг: 0 / 0
01.11.2019, 13:17
    #39884232
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс и сортировка по двум полям
qwwq2 ... или с полностью инвертированным по всем измерениям ... (if btree)

да полезное уточнение...
...
Рейтинг: 0 / 0
01.11.2019, 14:01
    #39884264
_WeSTMan_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс и сортировка по двум полям
Maxim Boguk_WeSTMan_Всем привет. Есть запрос, который выполняется очень долго.
Сам запрос:
Код: sql
1.
SELECT ID FROM smev_log ORDER BY LOGDATE DESC, ID ASC LIMIT 150 OFFSET 689113



Его план
Код: sql
1.
2.
3.
4.
5.
6.
7.
"Limit  (cost=2427156.39..2427156.76 rows=150 width=16) (actual time=20279.759..20279.842 rows=150 loops=1)"
"  ->  Sort  (cost=2425433.61..2470694.99 rows=18104552 width=16) (actual time=20012.573..20184.970 rows=689263 loops=1)"
"        Sort Key: logdate DESC, id"
"        Sort Method: top-N heapsort  Memory: 81462kB"
"        ->  Seq Scan on smev_log  (cost=0.00..579249.52 rows=18104552 width=16) (actual time=0.026..7501.096 rows=18104552 loops=1)"
"Planning time: 0.460 ms"
"Execution time: 20282.103 ms"



id - первичный ключ
по колонке logdate построен индекс.

Я попробовал составные индексы между ними - толку 0. Он все равно смотрит всю таблицу. Там 20 млн. записей
Подскажите, пожалуйста, как заставить запрос работать по индексам! Заранее спасибо!


1)большие offset никак быстро работать не будут что с ними не делай... потому что всеравно надо перебрать limit+offset записей... т.е. запрос в общем случае эквивалентен limit 700000.

2)для такого order by нужен индекс (log_date DESC, id ASC) составной а вы небось просто делали (log_date, id)
порядок сортировок в индексе должен совпадать с порядком сортировок в order by полностью.

Спасибо большое! Все работает!!!
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Индекс и сортировка по двум полям / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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