기록 기반 최적화 사용

미리보기 상태에서 지원을 받으려면 bigquery-history-based-optimization-support@google.com으로 이메일을 보내세요.

이 가이드에서는 쿼리의 기록 기반 최적화를 사용 설정, 중지, 분석하는 방법을 설명합니다.

기록 기반 최적화 정보

기록 기반 최적화는 이미 완료된 유사 쿼리 실행 정보를 사용하여 추가 최적화를 적용하고 사용된 슬롯 시간 및 쿼리 지연 시간과 같은 쿼리 성능을 더욱 향상시킵니다. 예를 들어 기록 기반 최적화를 적용하면 첫 번째 쿼리가 실행되는 데 60초가 걸릴 수 있지만 기록 기반 최적화가 식별된 경우에는 두 번째 쿼리 실행 시간이 30초에 불과할 수 있습니다. 이 프로세스는 추가할 최적화가 없을 때까지 계속됩니다.

다음은 기록 기반 최적화가 BigQuery에서 작동하는 방식의 예시입니다.

실행 횟수 소비된 쿼리 슬롯 시간 참고
1 60 원래 실행.
2 30 첫 번째 기록 기반 최적화가 적용되었습니다.
3 20 두 번째 기록 기반 최적화가 적용되었습니다.
4 21 적용할 추가 기록 기반 최적화가 없습니다.
5 19 적용할 추가 기록 기반 최적화가 없습니다.
6 20 적용할 추가 기록 기반 최적화가 없습니다.

기록 기반 최적화는 쿼리 성능에 유용한 영향을 줄 것이라는 확신이 있는 경우에만 적용됩니다. 또한 최적화로 쿼리 성능이 크게 향상되지 않으면 해당 최적화가 취소되고 향후에 쿼리를 실행하는 데 사용되지 않습니다.

기록 기반 최적화 사용 설정

프로젝트에서 기록 기반 최적화를 사용하려면 ALTER PROJECT 문에 default_query_optimizer_options = 'adaptive=on' 매개변수를 포함합니다.

예:

ALTER PROJECT `user_project`
SET OPTIONS (
  `region-us.default_query_optimizer_options` = 'adaptive=on'
);

기록 기반 최적화 중지

프로젝트에서 기록 기반 최적화를 중지하려면 ALTER PROJECTdefault_query_optimizer_options = 'adaptive=off' 매개변수를 포함합니다.

예:

ALTER PROJECT `user_project`
SET OPTIONS (
  `region-us.default_query_optimizer_options` = 'adaptive=off'
);

작업의 기록 기반 최적화 검토

작업의 기록 기반 최적화를 검토하려면 SQL 쿼리나 REST API 메서드 호출을 사용하면 됩니다.

SQL

쿼리를 사용하여 작업의 기록 기반 최적화를 가져올 수 있습니다. 쿼리에는 INFORMATION_SCHEMA.JOBS_BY_PROJECTquery_info.optimization_details 열 이름이 포함되어야 합니다.

다음 예시에서는 sample_job라는 작업의 최적화 세부정보가 반환됩니다. 기록 기반 최적화가 적용되지 않으면 NULLoptimization_details에 생성됩니다.

SELECT
  job_id,
  query_info.optimization_details
FROM `project_name.region-us`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE job_id = 'sample_job'
LIMIT 1;

결과는 다음과 유사합니다.

-- The JSON in optimization_details has been formatted for readability.
/*------------+-----------------------------------------------------------------*
 | job_id     | optimization_details                                            |
 +------------+-----------------------------------------------------------------+
 | sample_job | {                                                               |
 |            |   "optimizations": [                                            |
 |            |     {                                                           |
 |            |       "semi_join_reduction": "web_sales.web_date,RIGHT"         |
 |            |     },                                                          |
 |            |     {                                                           |
 |            |       "semi_join_reduction": "catalog_sales.catalog_date,RIGHT" |
 |            |     },                                                          |
 |            |     {                                                           |
 |            |       "semi_join_reduction": "store_sales.store_date,RIGHT"     |
 |            |     },                                                          |
 |            |     {                                                           |
 |            |       "join_commutation": "web_returns.web_item"                |
 |            |     },                                                          |
 |            |     {                                                           |
 |            |       "parallelism_adjustment": "applied"                       |
 |            |     },                                                          |
 |            |   ]                                                             |
 |            | }                                                               |
 *------------+-----------------------------------------------------------------*/

API

작업의 최적화 세부정보를 가져오려면 jobs.get 메서드를 호출하면 됩니다.

다음 예시에서 jobs.get 메서드는 전체 응답에 최적화 세부정보(optimizationDetails)를 반환합니다.

{
  "jobReference": {
    "projectId": "myProject",
    "jobId": "sample_job"
  }
}

결과는 다음과 유사합니다.

-- The unrelated parts in the full response have been removed.
{
  "jobReference": {
    "projectId": "myProject",
    "jobId": "sample_job",
    "location": "US"
  },
  "statistics": {
    "query": {
      "queryInfo": {
        "optimizationDetails": {
          "optimizations": [
            {
              "semi_join_reduction": "web_sales.web_date,RIGHT"
            },
            {
              "semi_join_reduction": "catalog_sales.catalog_date,RIGHT"
            },
            {
              "semi_join_reduction": "store_sales.store_date,RIGHT"
            },
            {
              "join_commutation": "web_returns.web_item"
            },
            {
              "parallelism_adjustment": "applied"
            }
          ]
        }
      }
    }
  }
}

역할 및 권한

  • 기록 기반 최적화를 선택하려면 BigQuery 기본 구성을 만드는 데 필요한 권한이 있어야 하며 ALTER PROJECT 문을 사용하여 기록 기반 최적화를 사용 설정해야 합니다. 기록 기반 최적화를 사용 설정하면 작업을 만든 사용자에 관계없이 해당 프로젝트의 모든 작업에서 기록 기반 최적화를 사용합니다. 기본 구성에 필요한 권한에 대한 자세한 내용은 기본 구성의 필수 권한을 참조하세요. 기록 기반 최적화를 사용 설정하려면 기록 기반 최적화 사용 설정을 참조하세요.

  • INFORMATION_SCHEMA.JOBS 뷰를 사용하여 작업의 기록 기반 최적화를 검토하려면 필수 역할이 있어야 합니다. 자세한 내용은 INFORMATION_SCHEMA.JOBS 뷰의 필수 역할을 참조하세요.