如何在纯SQL中为现有索引获取完整的CREATE INDEX子句?

ska*_*rus 6 postgresql

我写了一个简单的脚本来重新索引我们的PG数据库,每周一次.它有一个简单的逻辑:

  • 按膨胀字节数量获得前10个指数
  • 从hashmap变量中查找create index子句(索引名称 - > create子句)
    • 如果没有 - 登录到stderr并转到下一个索引
  • 同时创建新索引
  • 同时丢弃旧索引
  • 重命名新索引

作为适当的懒惰开发人员,我不喜欢这个概念,我必须不断更新我的hashmap.(另一方面,我这样做时发现了两个效率低下的指数.)

pg_index看起来很有用,有没有办法从中重建一个create index子句?

获取列列表很容易,但我们使用不同的索引类型,字段的不同opclasses,部分索引......谁知道什么.重要的是要确保我们将首先获得与用于创建索引的完全相同的子句.

Cra*_*ger 11

是的,这里有一个内置功能pg_get_indexdef.

例如:

regress=> SELECT pg_get_indexdef('demo_pkey'::regclass);
                    pg_get_indexdef                     
--------------------------------------------------------
 CREATE UNIQUE INDEX demo_pkey ON demo USING btree (id)
(1 row)
Run Code Online (Sandbox Code Playgroud)

  • 确实很遗憾,没有用于定义表的等效函数(“pg_get_tabledef()”确实很有用) (3认同)