将索引从一张表复制到另一张表

Kyl*_*cot 8 postgresql index dynamic-sql ddl plpgsql

我有一系列 ETL 作业,在这些作业中我swap使用CREATE TABLE table1_swap LIKE table1. 为了使填充table1_swap更快,我不包括索引。但是,当我完成加载时,我需要将这些索引重新应用于新填充的表。这些索引是在这些 ETL 作业范围之外创建的,因此CREATE INDEX如果我不需要,我宁愿不必对调用进行硬编码。

是否可以将一组索引从一个表“转移”或“复制”到另一个表?

a_h*_*ame 8

您可以从 Postgres 系统目录中检索每个索引的完整 DDL 语句。

以下将检索CREATE单个表的所有索引语句:

select pg_get_indexdef(idx.oid)||';'
from pg_index ind
  join pg_class idx on idx.oid = ind.indexrelid
  join pg_class tbl on tbl.oid = ind.indrelid
  left join pg_namespace ns on ns.oid = tbl.relnamespace
where tbl.relname = 'your_table_name'
   and ns.nspname = 'your_table_schema';
Run Code Online (Sandbox Code Playgroud)

您可以将输出假脱机到脚本中,并在复制数据并交换表名称后运行它。


Chr*_*ris 0

凯尔,

恐怕由于 PostgreSQL 的存储结构,简单的索引复制是不可能的。PostgreSQL 使用一种称为堆结构表的存储方法,其中向表中插入数据没有保证顺序或位置。

如果 PostgreSQL 要将完整的表从一个表记录复制到另一个表记录,包括每一行的所有版本、有关已删除行的信息等,那么我想人们也能够复制索引。

就 PostgreSQL 当前的运行方式而言,将数据从一个表复制到另一个副本表只能保证逻辑一致性:也就是说,原始表中存在的每一行都将存在于新表中,并且数据将是一行仅在行级别匹配。

在物理一致性方面,不能保证原始表中数据物理存储在磁盘上的方式与副本表中数据物理存储方式相匹配。

这一点很重要,因为索引本质上是一种将表中数据的一些信息映射到包含该数据的行的CTID的方法。

长话短说:除了一些创造性的黑客攻击之外,我相信传统的观点是您必须在新表上重建这些索引。抱歉我没有更好的消息。

  • 他不想复制索引的内容,只想复制索引的定义。 (3认同)