powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / обмануть оптимизатор
10 сообщений из 10, страница 1 из 1
обмануть оптимизатор
    #38747991
masterl77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
подскажите есть ли возможность в постгресе задать оптимизатору каким индексом пользоваться принудительно
...
Рейтинг: 0 / 0
обмануть оптимизатор
    #38748027
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
masterl77подскажите есть ли возможность в постгресе задать оптимизатору каким индексом пользоваться принудительно

штатными средствами нет невозможно...
а почему вы думаете что другой индекс будет лучше?
приведите пример проблемного запроса и explain analyze
c тем или другим индексом?

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
обмануть оптимизатор
    #38748099
masterl77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SELECT * FROM events
WHERE terminal_id=2407
and event_id IN (select id from events_definition where (id IN ('A','B','C','D',))
ORDER BY local_time DESC
limit 10;

если много параметров в in индекс не используется
если мало то используется индекс по полям terminal_id, event_id, local_time
...
Рейтинг: 0 / 0
обмануть оптимизатор
    #38748401
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
masterl77,

> IN (select id from events_definition where (id IN ('A','B','C','D',))

оберните в хранимку с выставленным ROWS 3

например так. ну или как то так, на этом принципе.
но это всё хаки крайних узко специфических кейзов.

возможно вам надо что-то более общее.
...
Рейтинг: 0 / 0
обмануть оптимизатор
    #38748432
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
masterl77SELECT * FROM events
WHERE terminal_id=2407
and event_id IN (select id from events_definition where (id IN ('A','B','C','D',))
ORDER BY local_time DESC
limit 10;

если много параметров в in индекс не используется
если мало то используется индекс по полям terminal_id, event_id, local_time

тут вопрос в том будет ли быстрее делать по индексу в первом случае
поэтому я и просил привести планы (explain analyze)


--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
обмануть оптимизатор
    #38749025
masterl77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Limit (cost=22.07..22861.85 rows=1000 width=307) (actual time=22.306..171261.985 rows=1000 loops=1)"
" Buffers: shared hit=13770378 read=220237"
" -> Nested Loop Semi Join (cost=22.07..1740070.61 rows=76185 width=307) (actual time=22.303..171261.367 rows=1000 loops=1)"
" Join Filter: ((events.event_id)::text = (events_definition.id)::text)"
" Buffers: shared hit=13770378 read=220237"
" -> Index Scan Backward using ev_local_time_ix on events (cost=0.00..1674905.96 rows=542820 width=307) (actual time=0.244..170287.937 rows=194407 loops=1)"
" Filter: (terminal_id = 2407)"
" Buffers: shared hit=13770369 read=220237"
" -> Materialize (cost=22.07..26.27 rows=8 width=16) (actual time=0.000..0.002 rows=8 loops=194407)"
" Buffers: shared hit=9"
" -> Bitmap Heap Scan on events_definition (cost=22.07..26.23 rows=8 width=16) (actual time=0.028..0.031 rows=8 loops=1)"
" Recheck Cond: ((id)::text = ANY ('{....}'::text[]))"
" Buffers: shared hit=9"
" -> Bitmap Index Scan on pk_events_definition (cost=0.00..22.07 rows=8 width=0) (actual time=0.021..0.021 rows=8 loops=1)"
" Index Cond: ((id)::text = ANY ('{.....}'::text[]))"
" Buffers: shared hit=8"
"Total runtime: 171270.861 ms"
...
Рейтинг: 0 / 0
обмануть оптимизатор
    #38749292
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
masterl77,
Изменится ли смысл запроса, если строку:

masterl77...
and event_id IN (select id from events_definition where (id IN ('A','B','C','D',))
...

записать как
Код: sql
1.
AND event_id IN ('A', 'B', 'C', 'D')


?

То есть запрос к таблице event_definition исключить вовсе.
...
Рейтинг: 0 / 0
обмануть оптимизатор
    #38749313
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\/\/\/\/\/\masterl77,
Изменится ли смысл запроса, если строку:

masterl77...
and event_id IN (select id from events_definition where (id IN ('A','B','C','D',))
...

записать как
Код: sql
1.
2.
3.
AND event_id IN ('A', 'B', 'C', 'D')
AND EXISTS(select id from events_definition where id = event_id)
--привел к логическому эквиваленту начальному


?

То есть запрос к таблице event_definition исключить вовсе.
...
Рейтинг: 0 / 0
обмануть оптимизатор
    #38749800
PCContra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторSELECT * FROM events
WHERE terminal_id=2407
and event_id IN (select id from events_definition where (id IN ('A','B','C','D',)))
ORDER BY local_time DESC
limit 10;
Если не ошибаюсь, то вторая часть запроса (and event_id IN (...)) будет выполняться для каждой строки таблицы events.
Я бы сделал так:
WITH t (id) AS (select id from events_definition where (id IN ('A','B','C','D',)))
SELECT * FROM events LEFT JOIN t ON(event_id=id)
WHERE terminal_id=2407 AND NOT id IS NULL


будет быстрее.

как-то так
...
Рейтинг: 0 / 0
обмануть оптимизатор
    #38750092
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\/\/\/\/\/\masterl77,
Изменится ли смысл запроса, если строку:

masterl77...
and event_id IN (select id from events_definition where (id IN ('A','B','C','D',))
...

записать как
Код: sql
1.
AND event_id IN ('A', 'B', 'C', 'D')


?

То есть запрос к таблице event_definition исключить вовсе.
смысл может изменится если в events_definition нету какого-то ID из 4-х а в events он есть.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / обмануть оптимизатор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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