使用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'
)
答案 0 :(得分:1)
只需使用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'
)
表达式col1 IS NULL
只是一个填充,它产生一个存储在索引中的布尔值,因为它是紧凑的(每行只有一个字节),并且不清楚哪些列有意义被包含。如果您不断查询所有列,并且您不关心通过虚拟复制所有数据占用磁盘空间,那么包含索引中的所有列在性能方面都是有意义的。
编辑:顺序扫描本身并不坏。通常,当PostgreSQL倾向于使用现有索引进行顺序扫描时,就有充分的理由。如果没有,可以调整配置以更准确地反映其服务器环境。