考虑以下查询:
select distinct pnumber
from project
where pnumber in
(select pnumber
from project, department d, employee e
where e.dno=d.dnumber
and
d.mgr_snn=ssn
and
e.lname='employee1' and project.pnumber = 2 )
or
pnumber in
(select pno
from works_on, employee
where essn=ssn and lname='employee1' );
我想使用 brin 索引进行测试,因此我删除了所有表上的主键约束并添加了以下索引:
CREATE INDEX idx_brin_pnumber ON project USING brin(pnumber);
CREATE INDEX idx_brin_ssn ON project USING brin(ssn);
CREATE INDEX idx_brin_dnumber ON project USING brin(dnumber);
CREATE INDEX idx_brin_essn ON project USING brin(essn);
我曾经认为原因是连接期间需要 seqScans,但是当我在没有任何索引的情况下运行相同的查询并启用 seqscan 时,它的成本要低得多。那么这是什么原因呢?
这正是 PostgreSQL 实现的方式
enable_seqscan=off
。您永远无法完全禁用顺序扫描,因为有时这是表的唯一访问方法。禁用后
enable_seqscan
,PostgreSQL 只会为每次顺序扫描增加 10000000000 的成本。这样,优化器将始终优先选择避免顺序扫描(如果有)的计划。