Aurora PostgreSQL 쿼리 계획 관리 개요 - Amazon Aurora

Aurora PostgreSQL 쿼리 계획 관리 개요

Aurora PostgreSQL 쿼리 계획 관리는 쿼리 계획 회귀를 유발할 수 있는 데이터베이스 변경과 관계없이 계획 안정성을 보장하도록 설계되었습니다. 쿼리 계획 회귀는 최적화 프로그램이 시스템 또는 데이터베이스가 변경된 후 지정된 SQL 문에 대해 최적이 아닌 계획을 선택할 때 발생합니다. 통계, 제한 사항, 환경 설정, 쿼리 파라미터 바인딩, PostgreSQL 데이터베이스 엔진으로의 업그레이드에 대한 변경 사항을 들 경우 계획 회귀가 발생할 수 있습니다.

Aurora PostgreSQL 쿼리 계획 관리를 사용하면 쿼리 실행 계획을 변경하는 방식과 시점을 제어할 수 있습니다. Aurora PostgreSQL 쿼리 계획 관리의 이점은 다음과 같습니다.

  • 강제로 최적화 프로그램이 소수의 알려진 정상 계획 중 하나를 선택하도록 하여 계획의 안정성을 높일 수 있습니다.

  • 계획을 중앙에서 최적화한 다음, 최고의 계획을 전역에 배포할 수 있습니다.

  • 사용되지 않는 인덱스를 식별하고 인덱스 생성 및 삭제의 영향을 평가할 수 있습니다.

  • 최적화 프로그램에서 발견한 새로운 최소 비용 계획을 자동으로 감지할 수 있습니다.

  • 성능을 개선하는 계획 변경 사항만 승인하도록 선택할 수 있어 위험이 더 적은 새로운 최적화 프로그램 기능을 사용해 볼 수 있습니다.

쿼리 계획 관리에서 제공하는 도구를 사전에 사용하여 특정 쿼리에 가장 적합한 계획을 지정할 수 있습니다. 또는 쿼리 계획 관리를 사용하여 변화하는 환경에 대응하고 계획 회귀를 방지할 수 있습니다. 자세한 내용은 Aurora PostgreSQL 쿼리 계획 관리에 대한 모범 사례 섹션을 참조하세요.

지원되는 SQL 문

쿼리 계획 관리는 다음 유형의 SQL 문을 지원합니다.

  • 복잡성과 관계없이 SELECT, INSERT, UPDATE 또는 DELETE 문

  • 준비된 문. 자세한 내용은 PostgreSQL 설명서의 PREPARE를 참조하세요.

  • 동적 문(즉시 실행 모드에서 실행되는 문 포함). 자세한 내용은 PostgreSQL 설명서의 Dynamic SQL(동적 SQL) 및 EXECUTE IMMEDIATE를 참조하세요.

  • 내장된 SQL 명령 및 문. 자세한 내용은 PostgreSQL 설명서의 Embedded SQL Commands(내장된 SQL 명령)를 참조하세요.

  • 명명된 함수 내의 문. 자세한 내용은 PostgreSQL 설명서에서 CREATE FUNCTION을 참조하세요.

  • 임시 테이블을 포함하는 문

  • 프로시저 및 DO 블록 내부의 문

쿼리 계획 관리를 수동 모드에서 EXPLAIN와 함께 사용하면 실제로 실행하지 않고도 계획을 캡처할 수 있습니다. 자세한 내용은 최적화 프로그램이 선택한 계획 분석 섹션을 참조하세요. 쿼리 계획 관리 모드(수동, 자동)에 대한 자세한 내용은 Aurora PostgreSQL 실행 계획 캡처 섹션을 참조하세요.

Aurora PostgreSQL 쿼리 계획 관리는 파티셔닝된 테이블, 상속, 행 수준의 보안 및 재귀적인 공통 테이블 표현식(CTE)을 비롯하여 모든 PostgreSQL 언어 기능을 지원합니다. 이러한 PostgreSQL 언어 기능에 대해 자세히 알아보려면 PostgreSQL 설명서의 Table Partitioning(테이블 파티셔닝), Row Security Policies(행 보안 정책), WITH Queries (Common Table Expressions)(WITH 쿼리(공통 테이블 표현식)) 및 기타 주제를 참조하세요.

Aurora PostgreSQL 쿼리 계획 관리 기능의 다양한 버전에 관한 자세한 내용은 Aurora PostgreSQL 릴리스 정보Aurora PostgreSQL apg_plan_mgmt 확장 버전을 참조하세요.

쿼리 계획 관리의 제한 사항

Aurora PostgreSQL 쿼리 계획 관리의 현재 릴리스에는 다음과 같은 제한이 적용됩니다.

  • 시스템 관계를 참조하는 문에 대한 계획은 캡처되지 않음 - 시스템 관계를 참조하는 문(예: pg_class)은 캡처되지 않습니다. 이는 내부적으로 사용되는 대량의 시스템 생성 계획이 캡처되는 것을 방지하기 위해 의도적으로 설계된 것입니다. 보기 내부의 시스템 테이블에도 적용됩니다.

  • Aurora PostgreSQL DB 클러스터에 더 큰 DB 인스턴스 클래스가 필요할 수 있음 - 워크로드에 따라 쿼리 계획 관리에 vCPU가 2개 이상인 DB 인스턴스 클래스가 필요할 수 있습니다. max_worker_processes 수는 DB 인스턴스 클래스 크기에 따라 제한됩니다. 2-vCPU DB 인스턴스 클래스(예: db.t3.medium)에서 제공된 max_worker_processes의 수가 지정된 워크로드에 충분하지 않을 수 있습니다. 쿼리 계획 관리를 사용하는 경우 Aurora PostgreSQL DB 클러스터클러스터에 vCPU가 2개 이상인 DB 인스턴스 클래스를 선택하는 것이 좋습니다.

    DB 인스턴스 클래스가 워크로드를 지원하지 못하는 경우, 쿼리 계획 관리에서 다음과 같은 오류 메시지가 발생합니다.

    WARNING: could not register plan insert background process HINT: You may need to increase max_worker_processes.

    이 경우 Aurora PostgreSQL DB 클러스터를 메모리가 더 많은 DB 인스턴스 클래스 크기로 스케일 업해야 합니다. 자세한 내용은 DB 인스턴스 클래스에 지원되는 DB 엔진 섹션을 참조하세요.

  • 세션에 이미 저장된 계획은 영향을 받지 않음 - 쿼리 계획 관리는 애플리케이션 코드를 변경하지 않고도 쿼리 계획에 영향을 줄 수 있는 방법을 제공합니다. 그러나 일반 계획이 이미 기존 세션에 저장되어 있는 경우 해당 쿼리 계획을 변경하려면 먼저 DB 클러스터 파라미터 그룹에서 plan_cache_mode를 force_custom_plan으로 설정해야 합니다.

  • apg_plan_mgmt.dba_plans 및 pg_stat_statements의 queryid는 다음과 같은 경우 분기될 수 있습니다.

    • 객체는 apg_plan_mgmt.dba_plans에 저장 후 삭제되고 다시 생성됩니다.

    • apg_plan_mgmt.plans 테이블을 다른 클러스터에서 가져왔습니다.

Aurora PostgreSQL 쿼리 계획 관리 기능의 다양한 버전에 관한 자세한 내용은 Aurora PostgreSQL 릴리스 정보Aurora PostgreSQL apg_plan_mgmt 확장 버전을 참조하세요.

쿼리 계획 관리 용어

이 주제에서 사용되는 용어는 다음과 같습니다.

관리형 문

쿼리 계획 관리 상태에서 최적화 프로그램이 캡처하는 SQL 문입니다. 관리형 문에는apg_plan_mgmt.dba_plans 보기에 하나 이상의 쿼리 실행 계획이 저장되어 있습니다.

계획 기준

주어진 관리형 문에 대해 승인된 계획 세트입니다. 즉, dba_plan 뷰에서 status 열에 '승인됨'이 있는 관리형 문에 대한 모든 계획입니다.

계획 기록

주어진 관리형 문에 대해 캡처된 모든 계획의 세트입니다. 계획 기록에는 상태와 관계없이 해당 문에 대해 캡처된 모든 계획이 포함됩니다.

쿼리 계획 회귀

최적화 프로그램이 새 PostgreSQL 버전이나 통계 변경과 같이 데이터베이스에 특정 변경이 있기 전보다 덜 최적의 계획을 선택하는 경우입니다.

Aurora PostgreSQL의 쿼리 계획 관리 버전

쿼리 계획 관리는 현재 사용 가능한 모든 Aurora PostgreSQL 릴리스에서 지원됩니다. 자세한 정보는 Aurora PostgreSQL 릴리스 정보에서 Amazon Aurora PostgreSQL 업데이트 내용의 목록을 참조하세요.

apg_plan_mgmt 확장을 설치하면 Aurora PostgreSQL DB 클러스터에 쿼리 계획 관리 기능이 추가됩니다. PostgreSQL의 버전마다 지원하는 apg_plan_mgmt 확장 버전이 다릅니다. 사용 중인 Aurora PostgreSQL 버전의 최신 릴리스로 쿼리 계획 관리 확장을 업그레이드하는 것이 좋습니다.

참고

apg_plan_mgmt 확장 버전에 대한 릴리스 정보는 Aurora PostgreSQL 릴리스 정보에서 Aurora PostgreSQL apg_plan_mgmt extension versions(Aurora PostgreSQL apg_plan_mgmt 확장 버전)를 참조하세요.

인스턴스에 연결하고 psql 및 metaccommand \dx를 사용하여 아래와 같이 확장을 나열하면 클러스터에서 실행 중인 버전을 확인할 수 있습니다.

labdb=> \dx List of installed extensions Name | Version | Schema | Description ---------------+---------+---------------+------------------------------------------------------------------- apg_plan_mgmt | 1.0 | apg_plan_mgmt | Amazon Aurora with PostgreSQL compatibility Query Plan Management plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (2 rows)

출력은 이 클러스터가 1.0 버전의 확장을 사용하고 있음을 보여줍니다. 특정 Aurora PostgreSQL 버전에서는 특정 apg_plan_mgmt 버전만 사용할 수 있습니다. 경우에 따라 최신 버전의 쿼리 계획 관리로 업그레이드할 수 있도록 Aurora PostgreSQL DB 클러스터를 새로운 마이너 릴리스로 업그레이드하거나 패치를 적용해야 할 수 있습니다. 출력에 표시된 apg_plan_mgmt 버전 1.0은 Aurora PostgreSQL 버전 10.17 DB 클러스터에서 가져온 것으로, 최신 apg_plan_mgmt 버전은 사용할 수 없습니다. 이 경우 Aurora PostgreSQL DB 클러스터를 더 이후 버전의 PostgreSQL로 업그레이드해야 합니다.

Aurora PostgreSQL DB 클러스터를 새로운 버전의 PostgreSQL로 업그레이드하는 것에 대한 자세한 내용은 Amazon Aurora PostgreSQL 업데이트 섹션을 참조하세요.

apg_plan_mgmt 확장을 업그레이드하는 방법을 알아보려면 Aurora PostgreSQL의 쿼리 계획 관리 섹션을 참조하세요.

Aurora PostgreSQL 쿼리 계획 관리 활성화

Aurora PostgreSQL DB 클러스터의 쿼리 계획 관리를 설정하려면 확장을 설치하고 여러 DB 클러스터 파라미터 설정을 변경해야 합니다. apg_plan_mgmt 확장을 설치하고 Aurora PostgreSQL DB 클러스터의 기능을 활성화하려면 rds_superuser 권한이 필요합니다.

확장을 설치하면 apg_plan_mgmt라는 새 역할이 생성됩니다. 이 역할을 통해 데이터베이스 사용자는 쿼리 계획을 보고, 관리하고, 유지 관리할 수 있습니다. rds_superuser 권한이 있는 관리자는 필요에 따라 데이터베이스 사용자에게 apg_plan_mgmt 역할을 부여해야 합니다.

rds_superuser 역할을 가진 사용자만 다음 절차를 완료할 수 있습니다. rds_superuser 확장 및 해당 apg_plan_mgmt 역할을 생성하는 데 apg_plan_mgmt이(가) 필요합니다. 사용자가 apg_plan_mgmt 확장을 관리하려면 apg_plan_mgmt 역할을 부여받아야 합니다.

Aurora PostgreSQL DB 클러스터에 쿼리 계획 관리를 활성화하는 방법

다음은 Aurora PostgreSQL DB 클러스터로 제출되는 모든 SQL 문에 대해 쿼리 계획 관리를 활성화하는 단계입니다. 이를 자동 모드라고 합니다. 모드 간의 차이에 대한 자세한 내용은 Aurora PostgreSQL 실행 계획 캡처 섹션을 참조하세요.

  1. https://console.aws.amazon.com/rds/에서 Amazon RDS 콘솔을 엽니다.

  2. Aurora PostgreSQL DB 클러스터에 사용할 사용자 지정 DB 클러스터 파라미터 그룹을 생성합니다. 쿼리 계획 관리를 활성화하고 동작을 설정하려면 특정 파라미터를 변경해야 합니다. 자세한 내용은 DB 파라미터 그룹 생성 섹션을 참조하세요.

  3. 사용자 지정 DB 클러스터 파라미터 그룹을 열고 다음 이미지에 표시된 대로 rds.enable_plan_management 파라미터를 1로 설정합니다.

    자세한 내용은 DB 클러스터 파라미터 그룹의 파라미터 수정 섹션을 참조하세요.

  4. 인스턴스 수준에서 쿼리 계획 파라미터를 설정하는 데 사용할 수 있는 사용자 지정 DB 파라미터 그룹을 생성합니다. 자세한 내용은 DB 클러스터 파라미터 그룹 만들기 섹션을 참조하세요.

  5. Aurora PostgreSQL DB 클러스터의 쓰기 인스턴스를 수정하여 사용자 지정 DB 파라미터 그룹을 사용하도록 합니다. 자세한 내용은 DB 클러스터에서 DB 인스턴스 수정 섹션을 참조하세요.

  6. Aurora PostgreSQL DB 클러스터를 수정하여 사용자 지정 DB 파라미터 그룹을 사용하도록 합니다. 자세한 내용은 콘솔, CLI, API를 사용하여 DB 클러스터 수정 섹션을 참조하세요.

  7. DB 인스턴스를 재부팅하여 사용자 지정 파라미터 그룹 설정을 활성화합니다.

  8. psql 또는 pgAdmin을 사용하여 Aurora PostgreSQL DB 클러스터의 DB 인스턴스 엔드포인트에 연결합니다. 다음 예에서는 rds_superuser 역할에 기본 postgres 계정을 사용합니다.

    psql --host=cluster-instance-1.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=my-db
  9. DB 인스턴스에 다음과 같이 apg_plan_mgmt 확장을 생성합니다.

    labdb=> CREATE EXTENSION apg_plan_mgmt; CREATE EXTENSION
    작은 정보

    애플리케이션의 템플릿 데이터베이스에 apg_plan_mgmt 확장을 설치합니다. 기본 템플릿 데이터베이스의 이름은 template1입니다. 자세한 내용은 PostgreSQL 설명서의 Template Databases(템플릿 데이터베이스)를 참조하세요.

  10. apg_plan_mgmt.capture_plan_baselines 파라미터를 automatic으로 변경합니다. 이 설정을 사용하면 옵티마이저는 계획되거나 두 번 이상 실행되는 모든 SQL 문에 대한 계획을 생성합니다.

    참고

    쿼리 계획 관리에는 특정 SQL 문에 사용할 수 있는 수동 모드도 있습니다. 자세한 내용은 Aurora PostgreSQL 실행 계획 캡처 단원을 참조하십시오.

  11. apg_plan_mgmt.use_plan_baselines 파라미터의 값을 '켜기'로 변경합니다. 이 파라미터를 사용하면 최적화 프로그램이 계획 기준에서 문에 대한 계획을 선택합니다. 자세한 내용은 Aurora PostgreSQL 관리형 계획 사용 단원을 참조하십시오.

    참고

    인스턴스를 재부팅하지 않고도 세션의 이러한 동적 파라미터 값을 수정할 수 있습니다.

쿼리 계획 관리 설정이 완료되면 쿼리 계획을 보거나 관리하거나 유지 관리해야 하는 모든 데이터베이스 사용자에게 apg_plan_mgmt 역할을 부여해야 합니다.

Aurora PostgreSQL의 쿼리 계획 관리

사용 중인 Aurora PostgreSQL 버전의 최신 릴리스로 쿼리 계획 관리 확장을 업그레이드하는 것이 좋습니다.

  1. Aurora PostgreSQL DB 클러스터의 라이터 인스턴스에 rds_superuser 권한을 가진 사용자로 연결합니다. 인스턴스를 설정할 때 기본 이름을 유지했다면 postgres로 연결합니다. 이 예에서는 psql 사용 방법을 보여주지만 원하는 경우 pgAdmin을 사용할 수도 있습니다.

    psql --host=111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
  2. 다음 쿼리를 실행하여 확장을 업그레이드합니다.

    ALTER EXTENSION apg_plan_mgmt UPDATE TO '2.1';
  3. apg_plan_mgmt.validate_plans 함수를 사용하여 모든 계획의 해시를 업데이트합니다. 최적화 프로그램은 모든 '승인됨', '승인되지 않음, '거부됨' 상태의 계획을 검증하여 확장의 새 버전에서 실행 가능한 계획인지 확인합니다.

    SELECT apg_plan_mgmt.validate_plans('update_plan_hash');

    이 함수 사용에 대한 자세한 내용은 계획 검증 섹션을 참조하세요.

  4. apg_plan_mgmt.reload 함수를 사용하여 공유 메모리의 모든 계획을 dba_plan 보기에서 검증된 계획으로 새로 고칩니다.

    SELECT apg_plan_mgmt.reload();

쿼리 계획 관리에 사용할 수 있는 모든 함수에 대한 자세한 내용은 Aurora PostgreSQL 쿼리 계획 관리를 위한 함수 참조 섹션을 참조하세요.

Aurora PostgreSQL 쿼리 계획 관리 비활성화

언제든지 apg_plan_mgmt.use_plan_baselinesapg_plan_mgmt.capture_plan_baselines를 비활성화하여 쿼리 계획 관리를 비활성화할 수 있습니다.

labdb=> SET apg_plan_mgmt.use_plan_baselines = off; labdb=> SET apg_plan_mgmt.capture_plan_baselines = off;