2017-02-16 1 views
0

Использование Postgresql 9.5, желающее узнать лучший способ индексирования таблицы, чтобы следующий запрос не использовал последовательное сканирование.Справка по индексу (Postgresql Not Equal Text)

SELECT * 
FROM MYTABLE 
WHERE (
COL1 NOT IN ('980','982','983','984','985','986','987','988','989','990','991','996','997') 
OR 
COL2 <> '999' 
) 
+0

И почему, по вашему мнению, сканирование 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) –

+0

никогда не говорил, что я думал, что они плохие – Pyrite

+0

Тогда почему вы хотите этого избежать? –

ответ

1

Просто определить частичный индекс с точно такими же, где пункт, используемые в вашем отборном заявлении:

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 поддерживает последовательное сканирование с использованием существующего индекса, для этого есть веская причина. Если нет, конфигурация может быть настроена для более точного отражения ее серверной среды.