From: | Oleg Bartunov <obartunov(at)gmail(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Снова подниму вопрос: как заставить pg использовать НУЖНЫЙ индекс? |
Date: | 2016-01-26 09:26:56 |
Message-ID: | CAF4Au4yNps26rUhf7Y6G3q979Cupj2QVCBifppebjFRRvTeWxA@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-ru-general |
2016-01-26 12:22 GMT+03:00 Dmitry E. Oboukhov <unera(at)debian(dot)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])
>
> "dispatcher_history_sign_idx" btree (gid, sid, did, booking_time)
>
> это индексы для разных списков разным интерфейсам. Удаляю любой из вторых
> индексов - Pg начинает использовать нужный мне индекс и все начинает
> летать. Но те другие индексы нужны для других запросов и
> соответственно они начинают лагать.
>
> Pg 9.3.1
>
по-хорошему надо explain analyze приводить, хотя я подозреваю, что оценка
стоимости для таких индексов не очень хороша.
Могу посоветовать поиграться с нашим
http://www.sai.msu.su/~megera/wiki/plantuner
> --
>
> . ''`. Dmitry E. Oboukhov
> : :’ : email: unera(at)debian(dot)org jabber://UNera(at)uvw(dot)ru
> `. `~’ GPGKey: 1024D / F8E26537 2006-11-21
> `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.10 (GNU/Linux)
>
> iEYEAREDAAYFAlanOswACgkQq4wAz/jiZTeXpwCgq5p2+cbHaYfIphmeUA8AfKQx
> 2w4AoLXhFe4JSKT96HWuJHoE/3qDPBNy
> =Psht
> -----END PGP SIGNATURE-----
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | Dmitry E. Oboukhov | 2016-01-26 09:33:36 | Re: Re: [pgsql-ru-general] Снова подниму вопрос: как заставить pg использовать НУЖНЫЙ индекс? |
Previous Message | Dmitry E. Oboukhov | 2016-01-26 09:22:20 | Снова подниму вопрос: как заставить pg использовать НУЖНЫЙ индекс? |