1

나는 배열의 요소는 데이터 자체가, 경우 포스트 그레스 배열이 성능 좋은 것을 볼 예를 들어, 태그PostgreSQL 배열을 결합에 최적화 할 수 있습니까?

http://shon.github.io/2015/12/21/postgres_array_performance.html

어떻게 외래 키 정수를 저장하는 방법으로 배열을 사용하는 경우에 대해? 외래 키 제약 문제가 없다면 정수 배열로 외래 키를 저장하는 것이 좋습니다?

앱은 보고서 또는 분석을 위해 최적화해야합니다. 그래서 응용 프로그램이 대부분의 시간에 테이블에 배열에 가입하게되면, 응용 프로그램이 외래 키의 레이블/제목/이름을 표시 할 필요가 있다고 말하면 외장 키의 저장을 위해 어레이를 사용하는 것이 여전히 괜찮습니까?

접합 테이블을 사용하는 것과 비교하여 어레이가 작을 때 성능이 향상 될 수 있습니까? 예를 들어 영화 장르의 정수 확인란은 말합니까?

어레이가 수천 인 경우 어쨌든 배열을 사용하지 않고 단지 접합 테이블을 사용할 때의 성능이 더 좋을까요?

답변

1

아니요. 배열에 FK를 저장하면 일반 용도의 테이블에는 적합하지 않습니다. 먼저, 전달할 때 언급 한 사실이 있습니다. 배열 요소에 대한 외래 키 제약 조건은 구현되지 않았습니다 (아직). 이것만으로도 아이디어가 무효화됩니다.

심각한 성능 문제로 인해 중단 된 Postgres 9.3의 기능을 구현하려는 시도가있었습니다. See this thread on pgsql-hackers.

또한 특정 사용 사례의 경우 어레이 성능이 향상 될 수 있지만 쓰기 성능이 떨어집니다. 생각해보십시오 : 긴 배열에서 단일 요소를 삽입, 업데이트 또는 삭제하려면 모든 찌그러진 요소에 대해 전체 배열로 새로운 행 버전을 작성해야합니다. 그리고 나는 또한 심각한 자물쇠 논쟁을 앞두고 있습니다. 테이블이 을 읽을 경우

는 생각은 더 이해하기 시작합니다. 그것을하면서

의 MV는 모든 테이블에 가입하고 포함 할 수 있습니다 그러나 나는 정규화 대다 구현 위에에 비정규 배열 materialized view을 고려할 것 더 나은 읽기 성능을위한 하나의 플랫 테이블을 생성합니다 (일반적인 사용 사례의 경우). 이 방법을 사용하면 참조 무결성 은 읽기 및 쓰기 성능이 뛰어납니다. 오버 헤드와 MV 관리를위한 추가 스토리지가 필요합니다.

+0

가능한 예외는 시스템 카탈로그입니다. 여기서 FK 제약 조건은 두 개의 병렬 * 배열로 나타납니다. 그러나 이러한 배열은 매우 작으며 카탈로그의 업데이트는 빈번하지 않으며 DML 문에 의해 직접적으로 수행되는 것이 아니라 내부 논리에 의해 수행됩니다. – wildplasser

+0

필자는 모델이 배열이고 모델을 배열로 저장한다는 것을 관용적이며 직관적이라고 생각합니다. 그러나 속도 만이 거래를 봉쇄 할 것입니다. 배열이 속도를 전달할 수 없다면, 나는 그것을 사용하지 않을 것이다. 나는 여전히 배열로 구현되고 참조 테이블에 조인 된 외래 키 (태그와 같은 요소가 아닌)가 접합 테이블 구현과 비교하여 더 빠른 수행 쿼리로 된 벤치 마크를 아직 찾지 못했습니다. –