열 기반 엔진 모니터링

문서 버전을 선택합니다.

이 페이지에서는 열 기반 엔진의 사용률을 모니터링하는 방법을 설명합니다.

EXPLAIN을 사용하여 열 기반 엔진 사용 확인

쿼리의 생성된 쿼리 계획에 표시되는 새로운 열 기반 연산자를 확인하려면 EXPLAIN 문을 사용하여 열 기반 엔진의 사용을 확인하면 됩니다.

EXPLAIN (ANALYZE,COSTS OFF,BUFFERS,TIMING OFF,SUMMARY OFF)
  SELECT l_returnflag, l_linestatus, l_quantity, l_extendedprice,
         l_discount, l_tax
    FROM lineitem
   WHERE l_shipdate <= date '1992-08-06'
;
                                 QUERY PLAN
-----------------------------------------------------------------------------
 Append (actual rows=3941797 loops=1)
   Buffers: shared hit=9
   ->  Custom Scan (columnar scan) on lineitem (actual rows=3941797 loops=1)
         Filter: (l_shipdate <= '1992-08-06'::date)
         Rows Removed by Columnar Filter: 56054083
         Columnar cache search mode: columnar filter only
         Buffers: shared hit=9
   ->  Seq Scan on lineitem (never executed)
  Filter: (l_shipdate <= '1992-08-06'::date)
  • Custom Scan (columnar scan)은 열 기반 엔진 스캔이 쿼리 계획에 포함되어 있음을 나타냅니다.
  • Rows Removed by Columnar Filter는 열 기반 벡터화 실행에 의해 필터링된 행 수를 나열합니다.
  • Columnar cache search mode, columnar filter only, native 또는 row store scan일 수 있습니다. 플래너는 비용 및 푸시다운 평가 기능을 기반으로 검색 모드를 자동으로 선택합니다.

플래너가 native 모드를 선택하면 일부 열 기반 연산자를 스캔으로 푸시합니다.

  • Rows Aggregated by Columnar Scan에는 집계된 행 수가 표시됩니다.
  • Rows Sorted by Columnar Scan에는 정렬된 행 수가 표시됩니다.
  • Rows Limited by Columnar Scan에는 스캔된 제한된 수의 행이 표시됩니다.

조인을 사용하면 열 기반 스캔 연산자도 Late Materialization 모드를 사용할 수 있습니다.

EXPLAIN (ANALYZE,COSTS OFF,BUFFERS,TIMING OFF,SUMMARY OFF)
  SELECT l_shipmode, o_orderpriority
    FROM orders, lineitem
   WHERE o_orderkey = l_orderkey
         AND l_shipmode in ('AIR', 'FOB')
         AND l_receiptdate >= date '1995-01-01'
;
                                 QUERY PLAN
-----------------------------------------------------------------------------
 Hash Join (actual rows=9865288 loops=1)
   Hash Cond: (lineitem.l_orderkey = orders.o_orderkey)
   Buffers: temp read=127738 written=127738
   ->  Append (actual rows=9865288 loops=1)
         ->  Custom Scan (columnar scan) on lineitem (actual rows=9865288 loops=1)
               Filter: ((l_shipmode = ANY ('{AIR,FOB}'::bpchar[])) AND
               (l_receiptdate >= '1995-01-01'::date))
               Rows Removed by Columnar Filter: 50130592
               Columnar cache search mode: native
         ->  Index Scan using idx_lineitem_orderkey_fkidx on lineitem
             (never executed)
               Filter: ((l_shipmode = ANY ('{AIR,FOB}'::bpchar[])) AND
               (l_receiptdate >= '1995-01-01'::date))
   ->  Hash (actual rows=15000000 loops=1)
         Buckets: 1048576  Batches: 32  Memory Usage: 37006kB
         Buffers: temp written=83357
         ->  Append (actual rows=15000000 loops=1)
               ->  Custom Scan (columnar scan) on orders (actual rows=15000000
                   loops=1)
                     Rows Removed by Columnar Filter: 0
                     Columnar projection mode: late materialization
                     Columnar cache search mode: native
               ->  Seq Scan on orders (never executed)

Columnar projection mode는 late materialization일 수 있습니다. 열 기반 연산자는 플래너가 일부 열 값의 구체화를 지연하여 프로젝션을 최적화할 때 이 모드를 자동으로 선택합니다.

열 기반 엔진 벡터화된 조인 사용량 보기

EXPLAIN 문을 사용하여 새 벡터화된 조인 연산자를 확인할 수 있습니다. 쿼리에서 생성된 쿼리 계획에 표시되는 새 Vectorized Hash Join 연산자를 관찰하면 됩니다.

EXPLAIN (ANALYZE,COSTS OFF,BUFFERS,TIMING OFF,SUMMARY OFF)
  SELECT l_quantity, l_extendedprice, l_discount, l_tax
    FROM lineitem, orders
    WHERE l_shipdate <= date '2022-08-06'
    AND  l_orderkey = o_orderkey
    AND  o_orderdate <= date '2025-03-07';
                                      QUERY PLAN
---------------------------------------------------------------------------------------
 Vectorized Hash Join (actual rows=3934686 loops=1)
   Vectorized partitioning, Partitions: 16 (Disk usage: 208MB)
   (Peak Memory Usage: 27MB, Threads: 1)
   Hash Cond: (lineitem.l_orderkey = orders.o_orderkey)
   Rows Removed by Bloom Filter: 0
   Buffers: temp read=26728 written=26728
   ->  Append (actual rows=3934686 loops=1)
         ->  Custom Scan (columnar scan) on lineitem (actual rows=3934686 loops=1)
               Filter: (l_shipdate <= '2022-08-06'::date)
               Rows Removed by Columnar Filter: 56051366
               Columnar cache search mode: native
         ->  Seq Scan on lineitem (never executed)
               Filter: (l_shipdate <= '2022-08-06'::date)
   ->  Vectorized Hash (actual rows=7245824 loops=1)
         Build bloom filter, Memory Usage: 1024kB
         ->  Append (actual rows=7245824 loops=1)
               ->  Custom Scan (columnar scan) on orders (actual rows=7245824 loops=1)
                     Filter: (o_orderdate <= '2025-03-07'::date)
                     Rows Removed by Columnar Filter: 7754176
                     Columnar cache search mode: native
               ->  Seq Scan on orders (never executed)
                     Filter: (o_orderdate <= '2025-03-07'::date)
  • Vectorized Hash Join 은 두 관계 간의 조인이 벡터화된 해시 조인을 사용했음을 나타냅니다.
  • Vectorized partitioning, Partitions: 에는 데이터가 분할된 파티션 수가 표시됩니다.

열 저장소에 열이 있는 테이블에 관한 정보 보기

g_columnar_relations 뷰를 쿼리하여 열 저장소에 열이 있는 테이블 또는 구체화된 뷰에 대한 정보를 볼 수 있습니다.

SELECT * FROM g_columnar_relations;

┌─[ RECORD 1 ]────────┬───────────────────┐
│ relation_name       │ tbl_parallel_test │
│ schema_name         │ public            │
│ database_name       │ advisor           │
│ status              │ Usable            │
│ size                │ 581431259         │
│ columnar_unit_count │ 3                 │
│ invalid_block_count │ 0                 │
│ total_block_count   │ 8337              │
├─[ RECORD 2 ]────────┼───────────────────┤
│ relation_name       │ lineitem          │
│ schema_name         │ public            │
│ database_name       │ advisor           │
│ status              │ Usable            │
│ size                │ 423224944         │
│ columnar_unit_count │ 29                │
│ invalid_block_count │ 0                 │
│ total_block_count   │ 115662            │
├─[ RECORD 3 ]────────┼───────────────────┤

열 저장소의 열에 관한 정보 보기

g_columnar_columns 뷰를 쿼리하여 열 저장소의 열에 관한 정보(열의 크기, 마지막 액세스 시간 등)를 볼 수 있습니다.

SELECT database_name, schema_name, relation_name, column_name, size_in_bytes, last_accessed_time FROM g_columnar_columns;

웹 UI에서 열 저장소 보기

AlloyDB Omni 웹 사용자 인터페이스에서 열 저장소 인벤토리를 볼 수도 있습니다.

  1. 웹 UI에 연결하고 클러스터를 선택합니다.
  2. 탐색 메뉴에서 열 기반 엔진을 클릭합니다.
  3. 열 스토어 데이터 테이블에서 열 스토어에 채워진 열을 검토합니다.
    • 데이터베이스 이름: 관계가 포함된 데이터베이스입니다.
    • 스키마 이름: 관계의 스키마입니다.
    • 관계 이름: 테이블 또는 구체화된 뷰의 이름입니다.
    • 열 이름: 열화된 열의 이름입니다.
    • 열 유형: 열의 SQL 데이터 유형입니다.
    • 상태: 열 저장소에 있는 열의 준비 상태입니다 (예: Usable).
    • 크기: 열 저장소에 있는 열의 메모리 사용량입니다.
    • 액세스: 열 기반 스캔에서 열에 액세스한 횟수입니다.
    • 마지막 액세스: 가장 최근의 열 스캔 액세스 타임스탬프입니다.

최근 쿼리의 열 기반 엔진 실행 통계 보기

g_columnar_stat_statements 뷰를 사용하여 최근 쿼리의 열 기반 엔진 실행 통계를 볼 수 있습니다. 이 뷰는 pg_stat_statements 확장 프로그램에서 제공하는 pg_stat_statements 뷰에 열 기반 엔진 통계를 추가합니다. 이 뷰를 사용하려면 먼저 pg_stat_statements 확장 프로그램을 사용 설정해야 합니다.

  1. pg_stat_statements 확장 프로그램을 사용 설정합니다.
    CREATE EXTENSION pg_stat_statements;
    
  2. 통계를 보려는 쿼리를 실행합니다. 이 작업을 수동으로 수행하거나 충분한 시간을 두고 애플리케이션이 pg_stat_statements를 사용 설정하여 이러한 쿼리를 실행하도록 할 수 있습니다.
  3. g_columnar_stat_statements 및 pg_stat_statements 뷰를 쿼리합니다. 다음 쿼리는 확장 프로그램 pg_stat_statements가 생성되기 전에 수집된 통계를 포함하여 모든 열 기반 실행 통계를 가져옵니다. userid의 10 값은 확장 프로그램 pg_stat_statements가 생성되기 전에 통계가 수집되었음을 나타냅니다.
    SELECT *
    FROM pg_stat_statements(TRUE) AS pg_stats
         FULL JOIN g_columnar_stat_statements AS g_stats
         ON pg_stats.userid = g_stats.user_id AND
            pg_stats.dbid = g_stats.db_id AND
            pg_stats.queryid = g_stats.query_id
    WHERE columnar_unit_read > 0;
    
    ┌─[ RECORD 1 ]────────┬───────────────────────────────
    │ userid              │ 10                            │
    │ dbid                │ 33004                         │
    │ queryid             │ 6779068104316758833           │
    │ query               │ SELECT  l_returnflag,        ↵│
    │                     │         l_linestatus,        ↵│
    │                     │         l_quantity,          ↵│
    │                     │         l_extendedprice,     ↵│
    │                     │         l_discount,          ↵│
    │                     │         l_tax                ↵│
    │                     │FROM  lineitem                ↵│
    │                     │WHERE  l_shipdate <= date $1│
    │ calls               │ 1                             │
    │ total_time          │ 299.969983                    │
    │ min_time            │ 299.969983                    │
    │ max_time            │ 299.969983                    │
    │ mean_time           │ 299.969983                    │
    │ stddev_time         │ 0                             │
    │ rows                │ 392164                        │
    │ shared_blks_hit     │ 0                             │
    │ shared_blks_read    │ 0                             │
    │ shared_blks_dirtied │ 0                             │
    │ shared_blks_written │ 0                             │
    │ local_blks_hit      │ 0                             │
    │ local_blks_read     │ 0                             │
    │ local_blks_dirtied  │ 0                             │
    │ local_blks_written  │ 0                             │
    │ temp_blks_read      │ 0                             │
    │ temp_blks_written   │ 0                             │
    │ blk_read_time       │ 0                             │
    │ blk_write_time      │ 0                             │
    │ user_id             │ 10                            │
    │ db_id               │ 33004                         │
    │ query_id            │ 6779068104316758833           │
    │ columnar_unit_read  │ 29                            │
    │ page_read           │ 115662                        │
    │ rows_filtered       │ 0                             │
    │ columnar_scan_time  │ 0                             │
    └─────────────────────┴───────────────────────────────┘
    

웹 UI에서 열 기반 쿼리 통계 보기

pg_stat_statements 확장 프로그램을 사용 설정한 후 AlloyDB Omni 웹 사용자 인터페이스에서 열 기반 쿼리 실행 통계를 검사할 수도 있습니다.

  1. 웹 UI에 연결하고 클러스터를 선택합니다.
  2. 탐색 메뉴에서 열 기반 엔진을 클릭합니다.
  3. 열 기반 쿼리 테이블에서 열 저장소를 사용한 분석 쿼리의 실행 통계를 검토합니다.
    • 쿼리 ID: 정제된 쿼리의 식별자입니다.
    • 쿼리: 상수 값이 자리표시자로 대체된 정제된 SQL 문 텍스트입니다.
    • 호출된 횟수: 쿼리가 실행된 횟수입니다.
    • 가져온 평균 행: 실행당 반환된 평균 행 수입니다.
    • 평균 지연 시간: 쿼리의 평균 실행 지연 시간입니다.
    • 최대 지연 시간: 쿼리에 기록된 최대 실행 지연 시간입니다.
    • 열 단위 읽기: 열 저장소에서 읽은 열 단위 수입니다.
    • 페이지 읽기: 실행 중에 읽은 페이지 수입니다.

열 저장소 메모리 사용량 보기

열 기반 엔진에서 사용할 수 있는 미사용 RAM의 양을 확인하려면 google_columnar_engine_memory_available 함수를 쿼리하면 됩니다. 출력 정수는 사용 가능한 메모리를 메가바이트(MB)로 보여줍니다.

SELECT google_columnar_engine_memory_available();

웹 UI에서 열 저장소 메모리 크기 및 설정 보기

AlloyDB Omni 웹 사용자 인터페이스에서 열 스토어 메모리 소비 및 구성 설정을 확인할 수도 있습니다.

  1. 웹 UI에 연결하고 클러스터를 선택합니다.
  2. 탐색 메뉴에서 열 기반 엔진을 클릭합니다.
  3. 다음 상태 및 메모리 표시기가 표시되는 열 저장소 설정 섹션을 검토합니다.
    • 열 기반 엔진: 열 기반 엔진이 활성 상태인지 여부를 나타냅니다 (예: Enabled).
    • 메모리 크기: 할당된 총 열 기반 메모리 중 사용 중인 열 저장소 메모리 양을 표시합니다 (예: 2.0 MB used of 1024.0 MB).
    • 자동 열 지정: 자동 열 지정이 사용 설정되었는지 여부를 나타냅니다 (예: Enabled).
    • 실행 빈도: 자동 열 지정 실행의 일정 간격을 표시합니다 (예: Every 5 minutes).
    • 열 기반 스캔: 열 기반 스캔 실행이 사용 설정되었는지 여부를 나타냅니다 (예: Enabled).

열 기반 엔진 스토리지 캐시 보기

열 기반 엔진의 스토리지 캐시에 대한 데이터를 보고 모니터링하려면 다음 명령어를 사용하면 됩니다.

명령어 설명
SELECT google_columnar_engine_storage_cache_used(); 사용된 열 기반 엔진 스토리지 캐시의 크기를 반환합니다.
SELECT google_columnar_engine_storage_cache_available(); 사용되지 않는 열 기반 엔진 스토리지 캐시의 크기를 반환합니다.
SHOW google_columnar_engine.storage_cache_size; 열 기반 엔진의 구성된 스토리지 캐시의 총 크기를 반환합니다.