2009-08-05 2 views
3

PostgreSQL 데이터베이스로 로그 파일을위한 ETL을하고 있으며 간단한 스타 스키마로 데이터를로드하는 성능을 최적화하는 데 사용되는 다양한 접근 방법에 대해 더 자세히 알고 싶습니다.SQL - 대량 삽입 및 대규모 조인의 성능 최적화?

맥락에서 질문을 넣어하려면, 여기에 내가 현재 무엇의 개요입니다 :

  1. 드롭 모든 외래 키와 고유의 제약
  2. 가져 오기 데이터 (~ 1 억 개 기록)
  3. 다시 제약 조건을 생성하고 팩트 테이블에 대한 분석을 실행합니다.

데이터 가져 오기는 파일에서로드하여 수행됩니다.

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 

있습니까?

답변

1

저는 소스에서 들어오는 데이터를 정상화하려고 시도하는 데 여러 가지 다른 접근법을 시도했으며, 일반적으로 지금 제가 선택한 방법을 사용하고 있습니다. 따르기 쉽고 사소한 변화는 미약합니다. 2 단계에서 생성 된 ID를 차원 테이블 중 하나에서 반환하려고하면 복잡한 일만 발생하고 대용량 데이터 집합에 효율적으로 사용할 수 있도록 작은 쿼리가 너무 많이 생성됩니다. Postgres는 현대 버전의 "신성 결합"에 대해 매우 효율적이어야하며 "select distinct except select"를 사용하면 잘 작동합니다. 다른 사람들은 더 잘 알지도 모르지만, 나는 당신의 현재 방법이 나의 perferred 방법 인 것을 발견했다.

0
당신이 (당신이 그것을 삽입 한 후) 당신이에 데이터를 삽입하고 각 차원의 기본 키 알고 2 단계 동안

,하지만 당신은 멀리이 정보를 던지고와 3 단계에서 그것을 재발견있어 당신의 "거룩하지 못한"9-way 조인.

대신 사실 테이블에 삽입 할 하나의 sproc을 만드는 것이 좋습니다. 예 : insertXXXFact(...)getOrInsertXXXDim이라는 명명 규칙에 따라 다른 sprocs (차원 당 하나)를 호출합니다. 여기서 XXX은 문제의 차원입니다. 이 sprocs 각각은 지정된 차원에 대한 새로운 행을 찾거나 삽입하여 참조 무결성을 보장하므로 팩트 테이블이 참조해야하는 차원의 기본 키를 반환해야합니다. 이 장치를 사용할 수없는 경우이 크게 더미 값을 삽입 지금 형태의 호출로 감소 당신이 3 단계에서해야 할 일을, insert into XXXFact values (DimPKey1, DimPKey2, ... etc.)

우리는 우리의 getOrInsertXXX sprocs가 채택 한 접근 방식이되어 줄 것입니다 나중에 이들 값을 확인하고 풍부하게하는 별도의 정화 프로세스가 필요합니다.

+1

원칙적으로 동의하지만,이 방법을 시도했을 때 평균적으로 50 % 느린 것으로 나타났습니다. 차원 테이블의 캐싱이 대량 작업 (개별 선택/삽입이 아닌)이 빠르기 때문에 모든 작업을 수행하는 것과 비슷합니다. – Rob

+1

@ Rob : 과거에는 저에게 효과적이었던 접근 방식이기 때문에 흥미 롭습니다. BTW 나는 어떤 대답도없이이 대답은 downvoted 믿을 수 없어! – Adamski