имеется большая таблица с заказами.
далее
в этой таблице очень немного заказов имеют статус '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@debian.org jabber://UNera@uvw.ru
`. `~’ GPGKey: 1024D / F8E26537 2006-11-21
`- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537