집 >데이터 베이스 >MySQL 튜토리얼 >대규모 데이터 세트에 대해 PostgreSQL의 'tablefunc'을 사용하여 다중 열 피벗을 어떻게 효율적으로 달성할 수 있습니까?
대규모 데이터 세트의 다중 열 피벗을 위한 PostgreSQL의 tablefunc
최적화
대규모 데이터 세트를 긴 형식에서 넓은 형식으로 효율적으로 변환(피버팅)하는 것은 데이터 분석에 매우 중요합니다. 이 문서에서는 특히 수십억 개의 행을 처리할 때 다중 열 피버팅을 위해 PostgreSQL의 tablefunc
확장을 사용할 때의 문제와 솔루션을 설명합니다.
피버팅 문제 해결
일반적인 문제는 tablefunc
을 사용하여 여러 변수가 포함된 데이터를 피벗하는 것과 관련됩니다. 예를 들어 time
, entity
, status
, measurement
같은 열이 있는 데이터를 각 measurement
값이 별도의 열을 차지하는 넓은 형식으로 변환합니다.
비효율의 근본 원인 파악
비효율성의 주요 원인은 tablefunc
쿼리 내 열 순서가 잘못되어 발생하는 경우가 많습니다. crosstab
함수는 특정 순서를 기대합니다. 행 식별자(데이터 구분 정의)가 첫 번째 열이어야 하고 그 뒤에 추가 열이 와야 하며 마지막으로 피벗할 값이 와야 합니다. time
및 entity
열을 바꾸는 등 잘못된 순서로 인해 행 식별자가 잘못 해석되어 성능에 심각한 영향을 미칠 수 있습니다.
해결책: 올바른 열 순서
해결책에는 crosstab
의 요구 사항을 준수하도록 열의 순서를 신중하게 변경하는 것이 포함됩니다. 아래 예는 이 수정을 보여줍니다. 여기서 entity
는 행 식별자이고 timeof
는 추가 열입니다.
<code class="language-sql">crosstab( 'SELECT entity, timeof, status, ct FROM t4 ORDER BY 1,2,3' ,$$VALUES (1::text), (0::text)$$)</code>
예시 및 출력
이 예에서는 dense_rank()
을 사용하여 고유한 행 식별자를 확인하고 generate_series
을 사용하여 피벗된 열 수를 정의하는 수정된 쿼리를 보여줍니다.
<code class="language-sql">SELECT localt, entity , msrmnt01, msrmnt02, msrmnt03, msrmnt04, msrmnt05 -- , more? FROM crosstab( 'SELECT dense_rank() OVER (ORDER BY localt, entity)::int AS row_name , localt, entity , msrmnt, val FROM test ORDER BY localt, entity, msrmnt' , 'SELECT generate_series(1,5)' ) AS ct (row_name int, localt timestamp, entity int , msrmnt01 float8, msrmnt02 float8, msrmnt03 float8, msrmnt04 float8, msrmnt05 float8 );</code>
이 수정된 접근 방식은 매우 큰 데이터 세트의 경우에도 tablefunc
을 사용한 효율적인 다중 열 피벗을 보장합니다. 최적의 성능을 위해서는 적절한 열 순서가 가장 중요합니다.
위 내용은 대규모 데이터 세트에 대해 PostgreSQL의 'tablefunc'을 사용하여 다중 열 피벗을 어떻게 효율적으로 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!