在这里查询:
EXPLAIN
SELECT persons.id AS id, ppm.first
FROM myschema.persons
INNER JOIN myotherschema.ppm ON persons.key = ppm.pid
WHERE persons.id = 279759;
ppm.pid
列是索引中的主键:
CREATE INDEX ppm_pkey_index
ON myotherschema.ppm
USING btree
(pid);
下面是解释:
Hash Join (cost=8.31..3105.40 rows=306 width=23)
Hash Cond: (textin(int4out(ppm.pid)) = persons.key)
-> Seq Scan on ppm (cost=0.00..2711.33 rows=61233 width=23)
-> Hash (cost=8.29..8.29 rows=1 width=12)
-> Index Scan using pskey on persons (cost=0.00..8.29 rows=1 width=12)
Index Cond: (id = 279759)
它似乎根本没有使用 ppm_pkey_index
:它似乎仍在扫描 61,233 行。为什么是这样?我误读了吗?推论:主键不是在 postgresql 中自动索引的吗?那么我的索引是多余的吗?
最佳答案
主键在您的键上创建UNIQUE INDEXES。所以你的索引确实是多余的。
创建索引后,您是否在表上运行了vacuum analyze
?
sql> vacuum analyze myotherschema.ppm;
我现在看到另一个问题:ppm.pid
和persons.key
是同一个字段类型吗?由于不必要的数据转换,您可能会遇到性能问题,并且无法使用索引,因为您没有为连接时需要使用的转换函数建立索引...
关于sql - 'splain a postgresql EXPLAIN to me,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4413374/