索引帮助(Postgresql不等于文本)

索引帮助(Postgresql不等于文本),sql,postgresql,Sql,Postgresql,使用Postgresql 9.5,希望知道索引表的最佳方法,以便以下查询不会使用顺序扫描 SELECT * FROM MYTABLE WHERE ( COL1 NOT IN ('980','982','983','984','985','986','987','988','989','990','991','996','997') OR COL2 <> '999' ) 选择* 从MYTABLE 在哪里( COL1不在('980','982','983','984','985','9

使用Postgresql 9.5,希望知道索引表的最佳方法,以便以下查询不会使用顺序扫描

SELECT *
FROM MYTABLE
WHERE (
COL1 NOT IN ('980','982','983','984','985','986','987','988','989','990','991','996','997')
OR
COL2 <> '999'
)
选择*
从MYTABLE
在哪里(
COL1不在('980','982','983','984','985','986','987','988','989','990','991','996','997')
或
COL2'999'
)

只需定义一个与select语句中使用的where子句完全相同的部分索引:

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'
)
在mytable上创建索引((col1为NULL))其中(
COL1不在('980','982','983','984','985','986','987','988','989','990','991','996','997')
或
COL2'999'
)
表达式
col1为NULL
只是一个填充,它生成一个存储在索引中的布尔值,因为它很紧凑(每行只有一个字节),并且不清楚包含哪些列是有意义的。如果您一直在查询所有列,而不关心通过虚拟复制所有数据来占用磁盘空间,那么在索引中包含所有列可能会提高性能


编辑:顺序扫描本身并不坏。一般来说,当PostgreSQL支持顺序扫描而不是使用现有索引时,这是有充分理由的。如果没有,可以调整配置以更准确地反映其服务器环境。

为什么您认为seq扫描不好?请回答您的问题并添加使用
解释(分析,详细)
生成的执行计划。请发短信,我从来没说过我认为他们很坏那你为什么要避免呢?