색인 미리 가져오기 개요

PostgreSQL용 AlloyDB는 색인 미리 가져오기를 사용하여 B-트리 색인을 통해 행 범위를 읽는 쿼리 속도를 높입니다. 색인 프리패치는 PostgreSQL 17 이상을 실행하는 AlloyDB 및 AlloyDB Omni 인스턴스에서 기본적으로 사용 설정되어 있습니다. 플래그를 설정하거나 색인을 다시 빌드하거나 애플리케이션 또는 SQL 쿼리를 변경하지 않아도 이점을 누릴 수 있습니다.

색인 미리 가져오기 작동 방식

쿼리가 색인을 통해 값 범위를 스캔하는 경우(예: 색인이 생성된 열의 BETWEEN 조건자 또는 ORDER BY ... LIMIT 절) 스캔은 색인 페이지와 색인 항목이 가리키는 테이블 페이지를 읽습니다. 이러한 테이블 페이지는 스토리지 전체에 분산되어 있는 경우가 많습니다. 표준 PostgreSQL에서 스캔은 이러한 페이지를 한 번에 하나씩 읽으므로 페이지가 아직 메모리에 없으면 쿼리는 대부분의 시간을 스토리지 I/O를 기다리는 데 소비합니다.

색인 미리 가져오기를 사용하면 AlloyDB가 색인과 테이블 모두에서 실행 중인 스캔을 미리 살펴보고 스캔에 필요한 페이지를 동시에 읽습니다. AlloyDB는 인스턴스의 로컬 SSD 캐시에 미리 가져온 페이지를 스테이징하므로 스캔에서 페이지를 요청하면 원격 스토리지 대신 빠른 로컬 스토리지에서 페이지가 제공됩니다. 미리 가져온 페이지는 PostgreSQL 공유 버퍼 외부에 스테이징되므로 미리 가져오기를 수행해도 다른 세션에서 사용할 수 있는 버퍼 캐시가 줄어들지 않습니다.

색인 프리패치에는 이점을 얻을 수 없는 쿼리에 오버헤드를 추가하지 않도록 다음과 같은 보호 장치가 포함되어 있습니다.

  • 미리 가져오기는 LIMIT 절의 경계에서 중지되므로 스캔은 쿼리가 반환하는 행을 지나 페이지를 읽지 않습니다.
  • 커버링 색인에 대한 색인 전용 스캔의 경우 AlloyDB는 색인 페이지만 미리 가져오고 테이블 페이지를 읽지 않습니다.
  • 기본 키 조회와 같이 단일 행을 반환하는 쿼리는 미리 가져오기를 트리거하지 않습니다.

워크로드의 이점

색인 프리패치는 작업 세트가 인스턴스의 메모리보다 크고 쿼리가 B-트리 색인을 통해 많은 행을 읽을 때 가장 유용합니다. 다음은 이점이 있는 쿼리의 예시입니다.

  • 일정 기간 동안의 보고서와 같이 색인이 생성된 타임스탬프, 날짜 또는 숫자 열에 대한 범위 쿼리
  • 고객의 주문 내역과 같이 하나의 키에 대해 여러 행을 반환하는 쿼리
  • 내부 측이 많은 행을 반환하는 색인 스캔인 조인
  • 행 지향 테이블에서 큰 범위를 읽는 분석 쿼리

데이터가 이미 공유 버퍼에 있는 쿼리와 단일 행 조회는 미리 가져오기 사용 여부와 관계없이 동일하게 수행됩니다.

실행 계획의 미리 가져오기

쿼리에 대한 색인 프리페치의 효과를 보려면 EXPLAIN (ANALYZE, BUFFERS)를 사용하여 쿼리를 실행합니다. 프리패치가 로컬 SSD 캐시에 로드하는 페이지는 계획의 색인 스캔 노드에 ultra fast cache hit 수로 표시됩니다. 이러한 카운터를 읽는 방법에 대한 자세한 내용은 실행 계획 가져오기 및 분석을 참조하세요.

다음 단계