2016-01-26 12:22 GMT+03:00 Dmitry E. Oboukhov <unera@debian.org>:
Имеется таблица orders
=> EXPLAIN ANALYZE SELECT * FROM "orders" "o" WHERE
"o"."status" IN ('confirm', 'accept', 'driving', 'waiting', 'transporting')
AND "o"."gid" = 1 AND "o"."sid" = 147 ;
Bitmap Heap Scan on orders o (cost=34577.20..44323.96 rows=2449 width=1867) (actual time=219.683..219.683 rows=0 loops=1) Recheck Cond: ((gid = 1) AND (sid = 147) AND (status = ANY ('{confirm,accept,driving,waiting,transporting}'::text[]))) -> BitmapAnd (cost=34577.20..34577.20 rows=2449 width=0) (actual time=218.928..218.928 rows=0 loops=1) -> Bitmap Index Scan on dispatcher_history_sign_idx (cost=0.00..6605.57 rows=99301 width=0) (actual time=104.751..104.751 rows=180593 loops=1) Index Cond: ((gid = 1) AND (sid = 147)) -> Bitmap Index Scan on driver_work_index (cost=0.00..27970.15 rows=1111648 width=0) (actual time=60.356..60.356 rows=34898 loops=1) Index Cond: (status = ANY ('{confirm,accept,driving,waiting,transporting}'::text[])) Total runtime: 219.814 ms (8 строк)
Видно что Pg зачем-то использует ДВА индекса и делает их BitmapAnd при этом выбирает 34 тысячи плюс 180 тысяч записей чтобы итого получить ноль. Если бы он использовал нужный индекс он бы мог получить этот ответ сразу.
хотя построен такой индекс:
"edispatcher_orders_service_idx" (gid, sid) WHERE status = ANY (ARRAY['confirm'::text, 'accept'::text, 'driving'::text, 'waiting'::text, 'transporting'::text])
Этот индекс построен специально под этот запрос, однако он использует такие индексы:
"driver_work_index" btree (did, status) WHERE status = ANY (ARRAY['confirm'::text, 'accept'::text, 'driving'::text, 'waiting'::text, 'transporting'::text])
это индексы для разных списков разным интерфейсам. Удаляю любой из вторых индексов - Pg начинает использовать нужный мне индекс и все начинает летать. Но те другие индексы нужны для других запросов и соответственно они начинают лагать.
Pg 9.3.1
по-хорошему надо explain analyze приводить, хотя я подозреваю, что оценка стоимости для таких индексов не очень хороша.