PostgreSQL 데이터베이스로 로그 파일을위한 ETL을하고 있으며 간단한 스타 스키마로 데이터를로드하는 성능을 최적화하는 데 사용되는 다양한 접근 방법에 대해 더 자세히 알고 싶습니다.SQL - 대량 삽입 및 대규모 조인의 성능 최적화?
맥락에서 질문을 넣어하려면, 여기에 내가 현재 무엇의 개요입니다 :
- 드롭 모든 외래 키와 고유의 제약
- 가져 오기 데이터 (~ 1 억 개 기록)
- 다시 제약 조건을 생성하고 팩트 테이블에 대한 분석을 실행합니다.
데이터 가져 오기는 파일에서로드하여 수행됩니다.
1) COPY를 사용하여 임시 테이블로의 데이터를로드 (PostgreSQL의 일괄 업로드 도구)
2) 새로운 데이터는 이러한 각에 대한 인서트를 사용하여 9 개 차원 테이블의 각 업데이트 : 각 파일에 대해 로 :
INSERT INTO host (name)
SELECT DISTINCT host_name FROM temp_table
EXCEPT
SELECT name FROM host;
ANALYZE host;
(가) (업데이트 수천만의 과정을 통해 최신 통계를 유지하는 아이디어와 INSERT의 끝에서 실행 분석이 그렇지 않은 최소한 바람직하거나 필요한가요 현저하게 성능을 저하시키는 것처럼 보입니다.)
3) 팩트 테이블은 신성 9 방법으로 업데이트됩니다 가입 : 내가 내려다 보이는 해요 거기에 더 나은 접근 방법이
INSERT INTO event (time, status, fk_host, fk_etype, ...)
SELECT t.time, t.status, host.id, etype.id ...
FROM temp_table as t
JOIN host ON t.host_name = host.name
JOIN url ON t.etype = etype.name
... and 7 more joins, one for each dimension table
있습니까?
원칙적으로 동의하지만,이 방법을 시도했을 때 평균적으로 50 % 느린 것으로 나타났습니다. 차원 테이블의 캐싱이 대량 작업 (개별 선택/삽입이 아닌)이 빠르기 때문에 모든 작업을 수행하는 것과 비슷합니다. – Rob
@ Rob : 과거에는 저에게 효과적이었던 접근 방식이기 때문에 흥미 롭습니다. BTW 나는 어떤 대답도없이이 대답은 downvoted 믿을 수 없어! – Adamski