首页 > 解决方案 > 创建没有数据的表非常慢

问题描述

我在 PostgreSQL 11 上运行这个 SQL 命令:

CREATE TABLE IF NOT EXISTS my_temp_table AS TABLE my_enormous_table WITH NO DATA;

制作新表需要 5 分钟。

EXPLAIN ...

Seq Scan on my_enormous_table  (cost=0.00..35999196.34 rows=143407234 width=3278)

移动到类似查询CREATE TABLE ... (SELECT * FROM my_enormous_table WHERE FALSE);的速度要快几个数量级 - 没有 seq 扫描,结果是一样的。

任何想法可能导致此问题?

标签: postgresql

解决方案


WITH NO DATA仍然执行查询,它只是忽略结果。

更好的方法是避免CREATE TABLE ... AS

CREATE TABLE my_temp_table (LIKE my_enormous_table);

这也允许您使用该INCLUDING子句从原始表中复制默认值、存储参数、约束和其他内容:

CREATE TABLE my_temp_table (LIKE my_enormous_table
                            INCLUDING CONSTRAINTS INCLUDING DEFAULTS);

推荐阅读