는 PostgreSQL의 9.0에 다음과 같은 구조의 테이블을 상상해PostgreSQL의 : 스타 스키마로 데이터를로드 효율적으로
create table raw_fact_table (text varchar(1000));
단순화를 위해서 난 단지 하나의 텍스트 열을 언급, 그것은 다스가 현실에서. 이 테이블에는 100 억 개의 행이 있고 각 열에는 많은 중복이 있습니다. 테이블은 COPY FROM을 사용하여 플랫 파일 (csv)에서 작성됩니다.
create table fact_table (dimension_table_id int);
내 현재의 방법
create table dimension_table (id int, text varchar(1000));
사실 테이블은 다음과 같은 사실 테이블로 대체 될 것이다 :
나는 다음과 같은 스타 스키마 구조로 변환 할 성능을 향상하려면 기본적으로 다음 쿼리를 실행하여 차원 테이블을 만듭니다.Create table dimension_table (id int, text varchar(1000), primary key(id));
다음 차원 테이블을 채우기 만들기 위해 내가 사용
select id into fact_table from dimension inner join raw_fact_table on (dimension.text = raw_fact_table.text);
그냥 몇 가지 다른 문자열로 모든 문자열을 비교하여 내가 얻을 끔찍한 성능을 상상 :
insert into dimension_table (select null, text from raw_fact_table group by text);
는 그 후 나는 다음과 같은 쿼리를 실행해야 타임스.
MySQL에서는 COPY FROM 중에 저장 프로 시저를 실행할 수있었습니다. 이것은 문자열의 해시를 만들 수 있으며 모든 후속 문자열 비교는 긴 원시 문자열 대신 해시에서 수행됩니다. 이것은 PostgreSQL에서 가능하지 않은 것 같습니다. 그럼 어떻게해야합니까?
샘플 데이터는 다음과 같이 (I 정수 주위 또한 따옴표를 사용하고 복식)를 포함하는 CSV 파일 다음과 같습니다
"lots and lots of text";"3";"1";"2.4";"lots of text";"blabla"
"sometext";"30";"10";"1.0";"lots of text";"blabla"
"somemoretext";"30";"10";"1.0";"lots of text";"fooooooo"
소요 시간은 어느 정도입니까? 얼마나 걸릴 것으로 예상 했습니까? –
언급 한 양의 데이터를 사용하여 끝내지는 않았습니다. 그러나 1 천 5 백만 행에 몇 시간이 걸렸습니다. 나는 모든 표준 서버 최적화 작업 (work_mem 등)을 이미 조사 했으므로 같은 결과를 얻는 다른 방법을 사용하고있다. – David
샘플 데이터와 DDL을 게시하십시오. –