Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / обмануть оптимизатор / 10 сообщений из 10, страница 1 из 1
16.09.2014, 15:08:54
    #38747991
masterl77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обмануть оптимизатор
подскажите есть ли возможность в постгресе задать оптимизатору каким индексом пользоваться принудительно
...
Рейтинг: 0 / 0
16.09.2014, 15:29:23
    #38748027
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обмануть оптимизатор
masterl77подскажите есть ли возможность в постгресе задать оптимизатору каким индексом пользоваться принудительно

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

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
16.09.2014, 16:05:15
    #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
16.09.2014, 19:46:05
    #38748401
Misha Tyurin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
обмануть оптимизатор
masterl77,

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

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

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

возможно вам надо что-то более общее.
...
Рейтинг: 0 / 0
16.09.2014, 20:52:56
    #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
17.09.2014, 12:59:47
    #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
17.09.2014, 15:26:35
    #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
17.09.2014, 15:42:31
    #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
17.09.2014, 22:48:37
    #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
18.09.2014, 11:11:31
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / обмануть оптимизатор / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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