쿼리 계획 관리

이 문서에서는 PostgreSQL용 AlloyDB에서 쿼리 계획 관리를 사용하여 쿼리 계획 성능을 개선하는 방법을 설명합니다. 쿼리 계획 관리는 데이터베이스의 모든 쿼리 계획과 실행 통계를 지속적으로 추적합니다. 쿼리 및 관련 비용을 검토한 후 특정 쿼리에 일관되게 적용되는 계획을 승인할 수 있습니다. 이 접근 방식을 사용하면 비용 효율적인 쿼리 계획을 선택하여 쿼리 성능을 개선할 수 있습니다.

작동 방식

PostgreSQL에서 쿼리 옵티마이저는 예상 비용을 기반으로 각 쿼리의 실행 계획을 선택합니다. 쿼리 매개변수, 쿼리 복잡성, 테이블 크기, 사용 가능한 색인, 시스템 리소스 등 다양한 요인이 쿼리 비용에 영향을 미칩니다.

쿼리 매개변수는 쿼리가 실행될 때마다 변경될 수 있으므로 쿼리 계획을 동적으로 선택하면 항상 최적의 결과가 나오지 않을 수 있습니다. 쿼리를 처리할 때 최적화 도구는 다양한 실행 계획을 평가하고 가장 비용 효율적인 계획을 선택하려고 합니다.

매개변수를 변경하면 요금제가 변경될 수 있습니다. 선택된 계획이 일반적으로 가장 비용 효율적인 옵션이지만 비용 효율성이 낮은 계획이 선택되어 쿼리 성능이 저하되는 인스턴스가 있을 수 있습니다. 쿼리 계획 관리를 사용하면 최적화 프로그램에서 생성된 패턴과 계획을 파악하고 정보에 입각한 의사 결정을 내릴 수 있도록 각 계획을 볼 수 있습니다.

쿼리 계획 관리의 두 가지 주요 구성요소는 다음과 같습니다.

쿼리 계획 저장소
데이터베이스에 쿼리 계획 관리를 사용 설정하면 계획 저장소에서 데이터베이스의 이전 계획과 실행 통계를 추적하기 시작합니다. 쿼리 계획 저장소는 쿼리 계획 성능에 관한 관측 가능성을 제공합니다.
요금제 관리
사용 가능한 계획을 검토한 후 계획 관리 구성요소를 사용하면 특정 쿼리 템플릿에 대해 하나 이상의 계획을 승인할 수 있습니다. 쿼리 계획 관리에서는 승인된 계획을 추적하고 쿼리가 후속 실행될 때 쿼리 최적화 도구가 승인된 계획 중 하나만 사용하도록 합니다. 여러 계획이 승인된 경우 AlloyDB는 예상 비용이 가장 낮은 계획을 선택하여 실행합니다.

시작하기 전에

  • google_plan_management.enabled 데이터베이스 플래그를 on로 설정합니다. 자세한 내용은 데이터베이스 플래그 구성을 참고하세요.
  • 데이터베이스에 google_plan_management 확장 프로그램을 만듭니다. 자세한 내용은 확장 프로그램 사용 설정을 참고하세요.
  • 쿼리 계획 관리를 사용하고 쿼리 계획을 관리하려는 데이터베이스 사용자에게 google_plan_management_role 권한을 부여합니다.

    1. Google Cloud 콘솔에서 AlloyDB 클러스터 페이지로 이동합니다.

      클러스터로 이동

    2. 필요한 인스턴스를 클릭합니다.

    3. AlloyDB Studio를 클릭한 다음 편집기 1 탭을 클릭합니다.

    4. 다음 쿼리를 입력합니다.

      GRANT google_plan_management_role TO DATABASE_USER;
      

      DATABASE_USER을 역할을 부여할 사용자로 바꿉니다.

    5. 실행을 클릭합니다.

추적된 쿼리 계획 보기

쿼리 계획 관리에서는 추적된 모든 쿼리 계획, 실행 시간, 기타 정보를 표시하는 쿼리 계획 보기를 제공합니다. 추적된 쿼리 계획은 옵티마이저에 의해 생성되고 계획 저장소에 저장되는 쿼리 계획입니다.

이전 추적 계획을 보려면 다음 쿼리를 실행하세요.

SELECT * FROM google_plan_management.tracked_plans_view;

쿼리 응답은 다음과 유사합니다.

db_id                | 5
db_name              | postgres
user_id              | 16392
user_name            | postgres
logical_query_id     | 15480571796188147798
plan_id              | 4740866759615354783
query                | SELECT c1, c2, c3 FROM t1 WHERE c1 = 1;
plan                 | Seq Scan on public.t1                                                                                                                                                            +
                     |   Output: c1, c2, c3                                                                                                                                                             +
                     |   Filter: (t1.c1 = ?)
total_execution_time | 0.003937501
num_executions       | 1
creation_time        | 2024-11-06 16:52:25.200737+00
last_used_time       | 2024-11-06 16:52:25.200737+00

쿼리 계획 추적 사용 중지

쿼리 계획 관리에서 옵티마이저가 생성한 쿼리 계획을 추적하지 않도록 하려면 google_plan_management.enable_track_plans 데이터베이스 플래그를 사용 중지해야 합니다. 이 플래그는 기본적으로 사용 설정되어 있으며 사용 설정 상태로 두는 것이 좋습니다. 자세한 내용은 데이터베이스 플래그 구성을 참고하세요.

관리 요금제 보기

승인된 계획과 거부된 계획을 비롯하여 쿼리 계획 관리에서 관리하는 모든 쿼리와 계획을 볼 수 있습니다.

관리 계획을 보려면 다음 쿼리를 실행하세요.

SELECT * FROM google_plan_management.managed_plans_view;

쿼리 응답은 다음과 유사합니다.

db_id            | 5
db_name          | postgres
user_id          | 16392
user_name        | postgres
logical_query_id | 15480571796188147798
plan_id          | 4740866759615354783
status           | approved

계획 승인

최적화 프로그램은 쿼리 계획을 동적으로 선택합니다. 즉, 시간대에 따라 동일한 쿼리에 대해 서로 다른 쿼리 계획을 선택할 수 있습니다. 일관된 계획 선택을 적용하려면 쿼리 계획 관리를 사용하여 특정 쿼리에 대해 하나 이상의 쿼리 계획을 승인하면 됩니다.

여러 계획을 승인하면 쿼리 계획 관리에서 승인된 모든 계획을 비교하고 쿼리 실행에 가장 비용 효율적인 계획을 선택합니다.

쿼리 계획을 평가하고 승인하려면 다음 단계를 따르세요.

  1. 최적화 프로그램이 생성한 추적된 계획을 확인하고 대답에서 logical_query_id를 식별합니다.

  2. logical_query_id에 대해 생성된 모든 계획을 검토합니다. total_execution_timenum_executions 값을 사용하여 각 계획의 평균 실행 시간을 계산한 다음 쿼리에 가장 적합한 계획을 결정할 수 있습니다.

    plan 열에는 사용된 색인이나 사용된 정렬 방법과 같은 기타 세부정보가 포함되어 있어 쿼리 계획을 결정하는 데 도움이 됩니다.

  3. 다음 쿼리를 실행하여 쿼리에 적용할 계획을 승인합니다.

      SELECT google_plan_management.approve_plan(QUERY_ID, PLAN_ID);
    

    다음을 바꿉니다.

    • QUERY_ID: 쿼리의 고유 logical_query_id입니다. 각 쿼리 ID는 여러 계획 ID와 연결될 수 있습니다.
    • PLAN_ID: 쿼리의 고유한 plan_id입니다.

계획 거부

쿼리에 대해 승인된 계획을 거부하고 쿼리 계획 관리가 쿼리에 계획을 적용하지 못하도록 할 수 있습니다. 거부된 요금제는 삭제되지 않으며 추적된 요금제 목록에서 확인할 수 있습니다.

승인된 계획을 거부하려면 다음 쿼리를 실행하세요.

    SELECT google_plan_management.deny_plan(QUERY_ID, PLAN_ID);

승인된 계획 삭제하기

계획 저장소에서 승인된 계획을 삭제할 수 있습니다. 승인된 요금제를 삭제하면 해당 요금제가 더 이상 관리 요금제 목록에 표시되지 않습니다.

승인된 계획을 삭제하려면 다음 쿼리를 실행하세요.

    SELECT google_plan_management.update_plan_status(QUERY_ID, PLAN_ID, 'delete');

승인된 계획의 사용을 일시적으로 중지하기

쿼리에 승인된 계획을 일시적으로 사용 중지하려면 google_plan_management.enable_steer_plans 데이터베이스 플래그를 사용 중지해야 합니다. 이 플래그는 기본적으로 사용 설정되어 있습니다. 자세한 내용은 데이터베이스 플래그 구성을 참고하세요.

제한사항

  • 파티션을 나눈 테이블이나 그룹화 집합에서는 쿼리 계획 관리를 사용할 수 없습니다.
  • 쿼리 계획 관리는 기본 인스턴스에서만 지원됩니다.
  • 쿼리 계획 저장소에는 최대 100, 000개의 고유한 계획을 저장할 수 있으며 보관 정책은 제공되지 않습니다.

다음 단계