Как заставить Pg использовать индекс?
От | Dmitry E. Oboukhov |
---|---|
Тема | Как заставить Pg использовать индекс? |
Дата | |
Msg-id | 20150108223010.GO31138@vdsl.uvw.ru обсуждение исходный текст |
Список | 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@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
Вложения
В списке pgsql-ru-general по дате отправления: