[PostgreSQL] 쿼리 최적화 - ANALYZE
·
개발 (Development)/PostgreSQL
ANALYZE 명령어는 PostgreSQL에서 통계 정보를 수집하여 쿼리 최적화에 필요한 정보를 갱신하는 데 사용됩니다. PostgreSQL의 쿼리 플래너는 쿼리를 최적화할 때 테이블과 열에 대한 통계 정보를 사용하므로, 정확한 통계 정보는 효율적인 쿼리 실행 계획을 수립하는 데 매우 중요합니다.1. ANALYZE 명령어의 기능테이블에 있는 각 열의 분포, 데이터 양, NULL 비율, 고유 값 수 등의 통계를 수집합니다.수집된 통계는 pg_statistic 시스템 테이블에 저장되며, 쿼리 플래너가 이를 참조하여 최적의 실행 계획을 생성합니다.테이블에 많은 데이터 변경(삽입, 업데이트, 삭제)이 발생한 후 ANALYZE를 실행하면 최신 통계 정보로 쿼리 성능을 개선할 수 있습니다.2. 기본 사용법전체 데이..
[PostgreSQL] 특정 컬럼 값이 가장 큰 경우만 불러오기
·
개발 (Development)/PostgreSQL
컬럼의 값이 가장 큰 행만 가져오도록 하기 위해서는 MAX(컬럼 명)를 활용하거나 서브쿼리 또는 ORDER BY를 사용할 수 있습니다. 다음은 depth가 가장 큰 값만 반환하는 쿼리의 예시입니다.방법 1: 서브쿼리 사용SELECT *FROM test_columnWHERE ancestor = 'test_01' AND depth = (SELECT MAX(depth) FROM test_column WHERE ancestor = 'test_01');방법 2: ORDER BY와 LIMIT 사용SELECT *FROM test_columnWHERE ancestor = 'test_01'ORDER BY depth DESCLIMIT 1;방법 1은 MAX(depth)..
[PostgreSQL] JSON 포맷 데이터 집계
·
개발 (Development)/PostgreSQL
PostgreSQL에서 JSON 형식의 데이터를 분석하려면 jsonb 데이터를 다룰 수 있는 함수와 연산자를 사용하면 됩니다. status 컬럼에 저장된 JSON 데이터에서 각 키별로 값의 종류와 그 개수를 계산하려면 jsonb_each_text 함수와 GROUP BY를 조합하여 쿼리를 작성할 수 있습니다.예제 테이블 구조CREATE TABLE example_table ( id SERIAL PRIMARY KEY, status JSONB);-- 데이터 삽입INSERT INTO example_table (status) VALUES('{"key1": "good", "key2": "critical"}'),('{"key1": "good", "key2": "warning"}'),('{"key1": "ba..
[PostgreSQL/TimescaleDB] Reordering chunk
·
개발 (Development)/PostgreSQL
TimescaleDB에서 chunk 재정렬(reordering)은 데이터의 성능 최적화를 위해 중요합니다. 특히, 쿼리 성능을 향상시키기 위해 chunks의 데이터 정렬을 다시 수행할 수 있습니다. TimescaleDB는 이를 위해 reorder_chunk 함수를 제공합니다.1. reorder_chunk 함수 사용reorder_chunk는 특정 chunk의 데이터를 지정된 인덱스 순서대로 재정렬합니다.사용법:SELECT reorder_chunk( chunk => '_timescaledb_internal._chunk_id_', index => 'index_name');chunk: 재정렬할 chunk의 이름 또는 ID를 지정합니다.index: 데이터를 재정렬할 기준이 되는 인덱스입니다.Chunk..
[PostgreSQL] 특정 값 비율 구하기
·
개발 (Development)/PostgreSQL
데이터 구조 예시컬럼:event_time (시간 데이터)asset_id (장치 ID)context_id (문맥 ID, 필요시 추가 사용)state (R 포함 상태 값)condition (상태 조건, 필요시 추가 사용)쿼리 작성WITH Total_Asset_Count AS ( SELECT asset_id, COUNT(*) AS total_count FROM your_table WHERE event_time BETWEEN 'YYYY-MM-DD HH:MI:SS' AND 'YYYY-MM-DD HH:MI:SS' GROUP BY asset_id),State_R_Count AS ( SELECT asset_id, COUNT(*) AS r_..