在Postgres中,最快的复制/克隆表的方法是什么?

5

"create table as ... select ..." 这是最快的方式。顺便说一句:括号在 select 语句周围完全没有用处。 - user330315
2个回答

3

更好的方法实际上取决于你希望实现什么目标。

如果你想保留原始表中的所有约束和索引,可以在CREATE TABLE语句中使用LIKE子句,如下所示:

CREATE TABLE tbl_2 (LIKE tbl_1 INCLUDING INDEXES INCLUDING CONSTRAINTS);

但这只会创建一个空表。您仍然需要复制数据进去。

我希望在性能方面是最快的。此外,我并不真的关心这里的限制,因为我的用例并不需要它。 - Ranjith Ramachandra

1

或者您可以使用类似以下的内容:

$ pg_dump -t tbl_1 | sed -e 's/^SET search_path = .*$/SET search_path = tmpschema, pg_catalog;' > table.sql
$ psql -d test -c 'CREATE SCHEMA tmpschema'
$ psql -1 -d test -f table.sql
$ psql -d test -c 'ALTER TABLE tmpschema.tbl_1 RENAME TO tbl_2; ALTER TABLE tmpschema.tbl_2 SET SCHEMA public; DROP SCHEMA tmpschema'

也许它并不比CREATE TABLE ... AS (SELECT ...)更快,但它将同时复制所有的索引和约束。

在创建表语句中使用的LIKE子句可以比使用pg_dump更轻松地创建具有相同索引和约束的新表。 - Gregory Arenius
是的,但它不会复制表内容。您可以运行 CREATE TABLE ... LIKE ... 然后 INSERT INTO ... (SELECT ...),但这肯定会很慢,因为索引和约束已经定义好了。pg_dump 在表数据之后转储索引和约束。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接