Lists: | pgsql-ru-general |
---|
From: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
---|---|
To: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Как заставить Pg использовать индекс? |
Date: | 2015-01-08 22:30:10 |
Message-ID: | 20150108223010.GO31138@vdsl.uvw.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
имеется большая таблица с заказами.
далее
в этой таблице очень немного заказов имеют статус 'confirm' и при этом
поле owner у них если NULL то таких еще меньше.
Запросы такие
SELECT
*
FROM
orders
WHERE
status = 'confirm'
AND owner IS NULL
AND gid = число -- номер группы
AND ... -- дополнительные фильтры
Строю индекс
CREATE INDEX test_idx ON orders ("gid")
WHERE status = 'confirm' AND AND owner IS NULL;
индекс занимает 150Кб - получается если база его будет использовать
будет рулез полнейший (таблица - несколько гигабайт)
проверяем
EXPLAIN ANALYZE
SELECT
*
FROM
orders
WHERE
status = 'confirm'
AND owner IS NULL
AND gid = 123
;
Показывает что наш индекс используется, отлично!
Добавляем еще AND
EXPLAIN ANALYZE
SELECT
*
FROM
orders
WHERE
status = 'confirm'
AND owner IS NULL
AND gid = 123
-- вот это добавили
AND name = 'Vasya'
;
и все, абзац, пошло делать Heap Scan. Индекс не стало использовать.
вопрос:
я не хочу выделять в секцию WITH, потому что используются курсоры
ну и просто не хочу.
как заставить Pg использовать этот индекс?
вроде же очевидно что условие AND дополнительное только сокращает
выборку
то есть по идее этот индекс должен использоваться, а он его
использовать не хочет.
ЧЯДНТ?
--
. ''`. 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
From: | Andrey Lizenko <lizenko79(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: | 2015-01-08 22:34:45 |
Message-ID: | CADKuZZA6u+Q8iHhs6hyCSNTw6F0AgTOWEG3LRTJ0Y9eFC7E33Q@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
И вот именно поэтому планировщик может решить, что heap\seq scan дешевле,
чем чтение индекса.
2015-01-09 1:30 GMT+03:00 Dmitry E. Oboukhov <unera(at)debian(dot)org>:
> вроде же очевидно что условие AND дополнительное только сокращает
> выборку
>
начните с подбора seq_page_cost и random_page_cost
--
Regards, Andrey Lizenko
From: | Andrey Lizenko <lizenko79(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: | 2015-01-08 22:37:51 |
Message-ID: | CADKuZZCjz2h7e82wPEvPnh9UsSfhw_o1mH8zBaXnXMOeZzf9NQ@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-ru-general |
а потом с остальными параметрами из
http://www.postgresql.org/docs/9.3/static/runtime-config-query.html#RUNTIME-CONFIG-QUERY-CONSTANTS
2015-01-09 1:34 GMT+03:00 Andrey Lizenko <lizenko79(at)gmail(dot)com>:
> И вот именно поэтому планировщик может решить, что heap\seq scan дешевле,
> чем чтение индекса.
>
> 2015-01-09 1:30 GMT+03:00 Dmitry E. Oboukhov <unera(at)debian(dot)org>:
>
>> вроде же очевидно что условие AND дополнительное только сокращает
>> выборку
>>
>
> начните с подбора seq_page_cost и random_page_cost
>
>
> --
> Regards, Andrey Lizenko
>
--
Regards, Andrey Lizenko