Re: [pgsql-ru-general] Как заставить Pg использовать индекс?

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