有没有一种方法可以显示PostgreSQL中索引的创建语句


14

我需要在遭受索引膨胀的PostgreSQL中重新创建索引。由于我需要索引在创建时就可用,因此不能使用REINDEX。我将使用新名称重新创建索引,然后删除旧名称。有什么办法可以查看用于创建索引的SQL语句,以便我可以复制它吗?



1
请记住要添加CONCURRENTLYCREATE INDEX命令中,这样您就不会在表上独占锁定。
Craig Ringer

Answers:


26

实际上,只需查询pg_indexes系统目录视图,如下所示:

SELECT indexdef FROM pg_indexes WHERE indexname = '...'

并且应该获取用于定义它的SQL语句。


4
请注意,索引名称仅在每个架构中唯一。您可能要添加AND schemaname = 'myschema'
Erwin Brandstetter,2015年

0

是的,系统目录中包含用于重新创建索引的完整SQL语句。我能想到的最简单的方法是使用pg_dump / pg_restore:

$ pg_dump -F c | pg_restore -I <your_index_name>

4
如果数据库很大,这可能是一个过大的问题:)您可能想要添加-s以排除数据,并使用来排除表名-t
dezso 2015年


-1

indexdef对于部分索引,它仍然与创建语句不完全相同。例如,如果我们使用以下语句创建索引: CREATE INDEX item_orgunit_idx ON items (orgunit_id) WHERE type IN ('invoice', 'purchaseorder', 'beanpayment');

postgres将生成以下indexdef: CREATE INDEX item_orgunit_idx ON public.items USING btree (orgunit_id) WHERE ((type)::text = ANY ((ARRAY['invoice'::character varying, 'purchaseorder'::character varying, 'beanpayment'::character varying])::text[]))

尽管postgres indexdef具有所有推断的类型并且可能更好,但是我们的ORM正在比较两个索引的where子句,并认为在生成迁移脚本时它是不同的。这对我们来说是个问题。


这根本无法回答问题。
Laurenz Albe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.