Postgres和索引外键和主键

Postgres会自动将索引放在外键和主键上吗? 我怎么知道? 有没有能够返回表中所有索引的命令?


PostgreSQL自动在主键和唯一约束上创建索引,但不在外键关系的引用端。

当Pg创建一个隐式索引时,它会发出一个NOTICE -level消息,你可以在psql和/或系统日志中看到,所以你可以看到它发生的时间。 自动创建的索引也可以在d输出中查看表格。

关于独特索引的文档说:

PostgreSQL会自动为每个唯一约束和主键约束创建一个索引来强制唯一性。 因此,没有必要为主键列显式创建索引。

和有关约束的文件说:

由于从被引用表中删除一行或被引用列的UPDATE需要扫描引用表以查找与旧值匹配的行,因此索引引用列通常是一个好主意。 因为这不总是需要的,并且在如何索引方面有很多选择,所以外键约束的声明不会自动在引用列上创建索引。

因此,如果你想要的话,你必须自己创建外键的索引。

请注意,如果您使用主键 - 外键,如2 FK作为M到N表中的PK,则您将在PK上有索引,并且可能不需要创建任何额外的索引。

在引用端外键列上创建索引通常是一个好主意,但这不是必需的。 您添加的每个索引都会稍微降低DML操作的速度,因此您需要为每个INSERTUPDATEDELETE支付一定的性能成本。 如果该指数很少使用,它可能不值得拥有。


如果您想要从程序中列出模式中所有表的索引,则所有信息都将存储在目录中:

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