powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Индекс и сортировка по двум полям
5 сообщений из 5, страница 1 из 1
Индекс и сортировка по двум полям
    #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
Индекс и сортировка по двум полям
    #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
Индекс и сортировка по двум полям
    #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
Индекс и сортировка по двум полям
    #39884232
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq2 ... или с полностью инвертированным по всем измерениям ... (if btree)

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


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