2014-06-06 2 views
1

다른 테이블의 정보를 기반으로 PostgreSQL 테이블을 클러스터하고 싶습니다.다른 테이블의 열/필드를 사용하여 PostgreSQL 테이블을 클러스터하는 방법

foos (id, baz_id, name)bars (foo_id, name)의 두 테이블을 상상해보십시오. bars.foo_idfoos.id에 대한 외래 키 참조입니다.

bar 테이블을 foos.baz_id에 의해 정렬되도록 클러스터링하고 싶습니다.

이것이 가능합니까?

+0

샘플 스키마는 실제로 두 테이블 사이의 관계를 표시하지 않습니다 (나는 foos에 foo_id가 있어야한다고 생각합니다). 더 중요한 것은 왜 이런 식으로 데이터를 클러스터링해야하는지/달성하고자하는 바를 설명 할 수 있습니까? – IMSoP

+0

@IMSoP 나의 데이터는 동일한 'baz_id'를 갖는'foos'와 관련된'bars'가 동일한 쿼리에서 리턴 될 가능성이 높습니다. 'bars'의 다른 열은 그 순서를 시뮬레이트 할 수 없습니다 ('foo_id'는 끔찍하지 않습니다). 나는 이것이 수억 개의 레코드 테이블에서 입출력 읽기 시간을 현저하게 줄이기를 기대합니다. –

답변

1

이것은 비정규 화를 사용하여 수행 할 수 있습니다.

bars.baz_id 열을 추가하고 해당 테이블에 적절한 값을 유지 관리하는 트리거 또는 응용 프로그램 계층 논리를 추가하십시오.

그런 다음 비정규 화 된 bars.baz_id 열을 사용하는 인덱스와 해당 인덱스로 클러스터를 추가하십시오.

+1

Postgres의'CLUSTER'는 다른 DBMS와 같이 영구적으로 클러스터 된 인덱스를 생성하지 않으며 인덱스를 기반으로 그 당시 존재하는 데이터를 정렬합니다. 새로운 데이터는 'CLUSTER'를 다시 실행하여 다시 정렬 할 때까지 계속해서 추가됩니다. – IMSoP

+0

각각의 'CLUSTER'이후에 다시'평준화 '하는 것도 중요합니다. –