Просто определить частичный индекс с точно такими же, где пункт, используемые в вашем отборном заявлении:
CREATE INDEX ON mytable ((col1 IS NULL)) WHERE (
COL1 NOT IN ('980','982','983','984','985','986','987','988','989','990','991','996','997')
OR
COL2 <> '999'
)
Выражение col1 IS NULL
просто заполняющее, в котором дает одно булево значение, которое хранится в индексе, потому что он компактный (всего один байт на строку), и неясно, какие столбцы имеют смысл для включения. Если вы продолжаете запрашивать все столбцы, и вы не заботитесь о том, чтобы занимать дисковое пространство, фактически дублируя все данные, тогда все столбцы в индексе могут иметь смысл с точки зрения производительности.
Редактировать: Последовательное сканирование не является плохим как таковым. Обычно, когда PostgreSQL поддерживает последовательное сканирование с использованием существующего индекса, для этого есть веская причина. Если нет, конфигурация может быть настроена для более точного отражения ее серверной среды.
И почему, по вашему мнению, сканирование seq плохое? Пожалуйста, отредактируйте свой вопрос и добавьте план выполнения, сгенерированный с помощью ** 'explain (analysis, verbose)' **. [_Formatted_] (http://dba.stackexchange.com/help/formatting) ** текст **, пожалуйста, [без скриншотов] (http://meta.stackoverflow.com/questions/285551/why-may-i -not-upload-images-of-code-on-so-when-ask-a-question/285557 # 285557) –
никогда не говорил, что я думал, что они плохие – Pyrite
Тогда почему вы хотите этого избежать? –