Re: 8.1 (win32): partial index not used?

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: 8.1 (win32): partial index not used?
Дата
Msg-id 17665.1146188981@sss.pgh.pa.us
обсуждение исходный текст
Ответ на 8.1 (win32): partial index not used?  (<me@alternize.com>)
Список pgsql-novice
<me@alternize.com> writes:
> i thought of changing the movies_folder_idx to a partial index for speeding
> up the query:

> movies_folder_idx: USING btree ((lower((mov_folder)::text))) WHERE
> ((mov_folder)::text <> ''::text);

> after adding the index, i've issued a reindex and ran the query again:

> query:
>    SELECT * FROM oldtables.movies WHERE mov_year = 2007 AND
> lower(mov_folder) = 'harrypotter5' LIMIT 1

> why isn't the index in queryplan2 used anymore?

Because the planner can't prove that the query only needs to access rows
satisfying the index's condition.  If you wrote

   SELECT * FROM oldtables.movies WHERE mov_year = 2007 AND
lower(mov_folder) = 'harrypotter5' AND
mov_folder <> '' LIMIT 1

then it'd work.

If you're expecting the planner to deduce mov_folder <> '' from
lower(mov_folder) = 'harrypotter5', sorry, that ain't happening.
That requires at least one piece of knowledge the planner does
not possess (that lower('') can't yield 'harrypotter5'), and even
with that knowledge available there'd be way more searching to make
this proof than we can afford to indulge in during the planning process.

I think it would work with that query if you'd made the partial index
predicate be WHERE lower(mov_folder) <> ''.  That matches the query
closely enough that the planner will figure out that what it needs to
check is whether 'harrypotter5' <> ''.

            regards, tom lane

В списке pgsql-novice по дате отправления:

Предыдущее
От:
Дата:
Сообщение: Re: 8.1 (win32): partial index not used?
Следующее
От: "Lane Van Ingen"
Дата:
Сообщение: WAL-related Problem?