Postgres和索引外键和主键
Postgres会自动将索引放在外键和主键上吗? 我怎么知道? 有没有能够返回表中所有索引的命令?
PostgreSQL自动在主键和唯一约束上创建索引,但不在外键关系的引用端。
当Pg创建一个隐式索引时,它会发出一个NOTICE
-level消息,你可以在psql
和/或系统日志中看到,所以你可以看到它发生的时间。 自动创建的索引也可以在d
输出中查看表格。
关于独特索引的文档说:
PostgreSQL会自动为每个唯一约束和主键约束创建一个索引来强制唯一性。 因此,没有必要为主键列显式创建索引。
和有关约束的文件说:
由于从被引用表中删除一行或被引用列的UPDATE需要扫描引用表以查找与旧值匹配的行,因此索引引用列通常是一个好主意。 因为这不总是需要的,并且在如何索引方面有很多选择,所以外键约束的声明不会自动在引用列上创建索引。
因此,如果你想要的话,你必须自己创建外键的索引。
请注意,如果您使用主键 - 外键,如2 FK作为M到N表中的PK,则您将在PK上有索引,并且可能不需要创建任何额外的索引。
在引用端外键列上创建索引通常是一个好主意,但这不是必需的。 您添加的每个索引都会稍微降低DML操作的速度,因此您需要为每个INSERT
, UPDATE
或DELETE
支付一定的性能成本。 如果该指数很少使用,它可能不值得拥有。
如果您想要从程序中列出模式中所有表的索引,则所有信息都将存储在目录中:
select
n.nspname as "Schema"
,t.relname as "Table"
,c.relname as "Index"
from
pg_catalog.pg_class c
join pg_catalog.pg_namespace n on n.oid = c.relnamespace
join pg_catalog.pg_index i on i.indexrelid = c.oid
join pg_catalog.pg_class t on i.indrelid = t.oid
where
c.relkind = 'i'
and n.nspname not in ('pg_catalog', 'pg_toast')
and pg_catalog.pg_table_is_visible(c.oid)
order by
n.nspname
,t.relname
,c.relname
如果您想深入研究(例如列和排序),您需要查看pg_catalog.pg_index。 使用psql -E [dbname]
可以方便地找出如何查询目录。
是 - 对于主键,否 - 对于外键(更多在文档中)。
d <table_name>
在“psql”中显示包含其所有索引的表的描述。
链接地址: http://www.djcxy.com/p/76299.html上一篇: Postgres and Indexes on Foreign Keys and Primary Keys
下一篇: Transform a table horizontally, with filling NULL columns when needed