PostgreSQL Generate_Series()插入未完成

时间:2019-04-03 19:15:39

标签: postgresql generate-series

因此,我试图跳过使用外部脚本生成模拟数据,而是在PostgreSQL中使用generate_series()。如果我尝试减少行数,充其量只能返回“无法写块:临时日志文件...设备上没有足够的空间”。

代码:

CREATE TABLE posts(
    id INTEGER PRIMARY KEY,
    author VARCHAR(20),
    likes INTEGER,
    content VARCHAR(200),
    posted TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO posts
SELECT DISTINCT id, author, likes, content, posted FROM 
    generate_series(1,10000) AS id, substr(md5(random()::text), 0, 20) AS 
    author, generate_series(1,10000) AS likes, md5(random()::text) AS 
    content, generate_series('2007-02-01'::timestamp, 
    '2018-04-01'::timestamp, '1 hour') AS posted;

我想到的几种可能性:

  • 这在某种程度上引起了分支因素,在这种情况下,可能会有更有效的编写方式
  • 我的硬件不足(i5-4210U,8GB RAM,500GB HDD和约20GB) 空间的左侧)。但是我也已经在2TB台式机上运行了此程序,以达到相同的结果。
  • md5 hash或random()函数导致巨大的阻塞,这就是为什么我的计算机在运行此查询的前几分钟冻结的原因。

1 个答案:

答案 0 :(得分:1)

通过执行from子句中的操作,您将获得生成的所有集合的笛卡尔积。如果您只想生成10000行,则需要以下内容。

INSERT INTO posts
SELECT id, substr(md5(random()::text), 0, 20) AS author, (random() * 100)::integer AS likes, 
    md5(random()::text) AS content, '2007-02-01'::timestamp + (id * '1 hour'::interval) AS posted 
FROM 
    generate_series(1,10000) AS id