제 경력을 쌓는 동안 평평하고 비정규 화 된 데이터를 정규화 된 구조에 삽입해야하는 많은 경우를 접했습니다.
이를 위해 저는 종종 CTE 삽입물을 사용했습니다. 예
CREATE TABLE raw_data (
foo varchar,
bar_1 varchar,
bar_2 varchar
);
INSERT INTO raw_data VALUES ('A', 'A1', 'A2');
INSERT INTO raw_data VALUES ('B', 'B1', 'B2');
CREATE TABLE foo (
id int PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
value varchar NOT NULL
);
CREATE TABLE bar (
id int PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
value varchar NOT NULL,
foo_id int NOT NULL,
CONSTRAINT fk_bar_foo FOREIGN KEY (foo_id) REFERENCES foo(id)
);
WITH new_foos AS (
INSERT INTO foo (value)
SELECT foo FROM raw_data
RETURNING *
)
INSERT INTO bar (foo_id, value)
SELECT
f.id,
unnest(ARRAY[r.bar_1, r.bar_2])
FROM new_foos f
JOIN raw_data r
ON r.foo = f.value;
그러나 성능 측면에서 보면 잘 작동하지만 원시 데이터 테이블로 돌아가서 다시 스캔해야하는 것은 부끄러운 것 같습니다. 즉 한 번 삽입을 수행 foo
한 다음 다시 삽입합니다 bar
.
이것이 최적의 접근 방식인지 아니면 개선을 위해 무엇을 할 수 있는지 알고 싶습니다.
음 그렇습니다.하지만 생각해 보면 Json을 담을 충분한 메모리가 있다면 테이블을 보관할 충분한 메모리가있는 것입니다. 따라서 데이터를 두 번 전달하는 것이 더 빠를 수 있습니다. 디스크 1 회, 메모리 1 회. DBMS는 이러한 이유로 가장 많이 사용 된 데이터를 메모리에 유지하는 경향이 있습니다. 면책 조항 : 내 주요 경험은 Oracle에 대한 것이므로 여기에서 Postgres로 투영 할 수 있지만이 버퍼링을 수행한다고 생각합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다