PostgreSQL Generate_Series () Вставка не завершена - PullRequest
1 голос
/ 03 апреля 2019

Так что я пытаюсь пропустить генерацию фиктивных данных с помощью внешнего скрипта и вместо этого использовать generate_series () в PostgreSQL. Если я попробую меньше строк, то в лучшем случае получится сообщение «невозможно записать блок: временный файл журнала ... недостаточно места на устройстве».

Код:

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, 8 ГБ ОЗУ, 500 ГБ HDD и около 20 ГБ осталось места). Но я также запустил это на своем рабочем столе 2 ТБ с теми же результатами.
  • Функции md5 hash или random () вызывают огромную блокировку, поэтому мой компьютер зависает в течение первых нескольких минут выполнения этого запроса.

1 Ответ

1 голос
/ 04 апреля 2019

Делая то, что вы делаете в предложении 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
...