sql - 'splain a postgresql EXPLAIN to me

标签 sql postgresql sql-execution-plan

在这里查询:

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.pidpersons.key 是同一个字段类型吗?由于不必要的数据转换,您可能会遇到性能问题,并且无法使用索引,因为您没有为连接时需要使用的转换函数建立索引...

关于sql - 'splain a postgresql EXPLAIN to me,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4413374/

相关文章:

MySQL COUNT 和 GROUP BY 子查询

使用两个连接的列将 MySQL 组连接转换为 Postgres

postgresql - 使用 FreeSWITCH 的本地 PostgreSQL 支持编写 Lua 脚本?

sql - 在 WHERE 子句中将 VARCHAR 转换为 INT/NUMBER

postgresql - LIMIT 与 ORDER BY 使查询变慢

oracle - 如何查看Oracle中的SQL执行计划?

mysql - # 打乱 SQL 查询的符号

java - JPA实体关系?

sql - Postgres : Create index on that text is null or not

sql - 针对日期范围的条件的查询性能