|
|
|
обмануть оптимизатор
|
|||
|---|---|---|---|
|
#18+
подскажите есть ли возможность в постгресе задать оптимизатору каким индексом пользоваться принудительно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2014, 15:08:54 |
|
||
|
обмануть оптимизатор
|
|||
|---|---|---|---|
|
#18+
masterl77подскажите есть ли возможность в постгресе задать оптимизатору каким индексом пользоваться принудительно штатными средствами нет невозможно... а почему вы думаете что другой индекс будет лучше? приведите пример проблемного запроса и explain analyze c тем или другим индексом? --Maxim Boguk www.postgresql-consulting.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2014, 15:29:23 |
|
||
|
обмануть оптимизатор
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2014, 16:05:15 |
|
||
|
обмануть оптимизатор
|
|||
|---|---|---|---|
|
#18+
masterl77, > IN (select id from events_definition where (id IN ('A','B','C','D',)) оберните в хранимку с выставленным ROWS 3 например так. ну или как то так, на этом принципе. но это всё хаки крайних узко специфических кейзов. возможно вам надо что-то более общее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2014, 19:46:05 |
|
||
|
обмануть оптимизатор
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.09.2014, 20:52:56 |
|
||
|
обмануть оптимизатор
|
|||
|---|---|---|---|
|
#18+
"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" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2014, 12:59:47 |
|
||
|
обмануть оптимизатор
|
|||
|---|---|---|---|
|
#18+
masterl77, Изменится ли смысл запроса, если строку: masterl77... and event_id IN (select id from events_definition where (id IN ('A','B','C','D',)) ... записать как Код: sql 1. ? То есть запрос к таблице event_definition исключить вовсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2014, 15:26:35 |
|
||
|
обмануть оптимизатор
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\masterl77, Изменится ли смысл запроса, если строку: masterl77... and event_id IN (select id from events_definition where (id IN ('A','B','C','D',)) ... записать как Код: sql 1. 2. 3. ? То есть запрос к таблице event_definition исключить вовсе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2014, 15:42:31 |
|
||
|
обмануть оптимизатор
|
|||
|---|---|---|---|
|
#18+
автор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 будет быстрее. как-то так ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2014, 22:48:37 |
|
||
|
обмануть оптимизатор
|
|||
|---|---|---|---|
|
#18+
/\/\/\/\/\/\masterl77, Изменится ли смысл запроса, если строку: masterl77... and event_id IN (select id from events_definition where (id IN ('A','B','C','D',)) ... записать как Код: sql 1. ? То есть запрос к таблице event_definition исключить вовсе. смысл может изменится если в events_definition нету какого-то ID из 4-х а в events он есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2014, 11:11:31 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38747991&tid=1998492]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 397ms |

| 0 / 0 |
