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
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] Как можно полностью очистить базу данных? |