Как заставить Pg использовать индекс?

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: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
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

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Andrey Lizenko 2015-01-08 22:34:45 Re: [pgsql-ru-general] Как заставить Pg использовать индекс?
Previous Message Andrey Lizenko 2015-01-02 23:00:22 Re: [pgsql-ru-general] Как можно полностью очистить базу данных?