Usar otimizações baseadas no histórico

Para receber ajuda durante a prévia, envie um e-mail para bigquery-history-based-optimization-support@google.com.

Neste guia, descrevemos como ativar, desativar e analisar otimizações baseadas em histórico para consultas.

Sobre as otimizações baseadas no histórico

As otimizações com base em histórico usam informações de execuções já concluídas de consultas semelhantes para aplicar outras otimizações e melhorar ainda mais o desempenho da consulta, como o tempo de slot consumido e a latência da consulta. Por exemplo, quando você aplica a otimização baseada em histórico, a primeira execução de consulta pode levar 60 segundos, mas a segunda execução pode levar apenas 30 segundos se uma otimização baseada em histórico for identificada. Esse processo continua até que não haja outras otimizações a serem adicionadas.

Confira a seguir um exemplo de como as otimizações baseadas no histórico funcionam com o BigQuery:

Contagem de execução Tempo do slot de consulta consumido Observações
1 60 Execução original.
2 30 Primeira otimização baseada no histórico aplicada.
3 20 Segunda otimização baseada no histórico aplicada.
4 21 Não há outras otimizações com base no histórico para aplicar.
5 19 Não há outras otimizações com base no histórico para aplicar.
6 20 Não há outras otimizações com base no histórico para aplicar.

As otimizações com base no histórico são aplicadas somente quando há alta confiança de que haverá um impacto benéfico no desempenho da consulta. Além disso, quando uma otimização não melhora significativamente o desempenho da consulta, ela é revogada e não é usada em execuções futuras dessa consulta.

Ativar otimizações baseadas no histórico

Para usar otimizações baseadas em histórico em um projeto, inclua o seguinte parâmetro na instrução ALTER PROJECT: default_query_optimizer_options = 'adaptive=on'

Exemplo:

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

Desativar otimizações baseadas no histórico

Para desativar as otimizações baseadas no histórico em um projeto, inclua o parâmetro default_query_optimizer_options = 'adaptive=off' na instrução ALTER PROJECT.

Exemplo:

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

Revisar as otimizações baseadas no histórico de um job

Para revisar as otimizações baseadas no histórico de um job, use uma consulta SQL ou uma chamada de método da API REST.

SQL

Você pode usar uma consulta para ter otimizações baseadas no histórico de um job. A consulta precisa incluir INFORMATION_SCHEMA.JOBS_BY_PROJECT e o nome da coluna query_info.optimization_details.

No exemplo a seguir, os detalhes de otimização são retornados para um job chamado sample_job. Se nenhuma otimização baseada em histórico for aplicada, NULL será produzido para optimization_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;

Os resultados são semelhantes aos seguintes:

-- 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

Para ver os detalhes de otimização de um job, chame o método jobs.get.

No exemplo a seguir, o método jobs.get retorna os detalhes de otimização (optimizationDetails) na resposta completa:

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

Os resultados são semelhantes aos seguintes:

-- 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"
            }
          ]
        }
      }
    }
  }
}

Papéis e permissões

  • Para ativar as otimizações baseadas em histórico, é necessário ter as permissões necessárias para criar as configurações padrão do BigQuery e usar a instrução ALTER PROJECT para ativar essas otimizações. Depois de ativar as otimizações baseadas em histórico, todos os jobs desse projeto usarão essas otimizações, independentemente de qual usuário criou o job. Para saber mais sobre as permissões necessárias para as configurações padrão, consulte Permissões necessárias para as configurações padrão. Para ativar as otimizações baseadas no histórico, consulte Ativar otimizações baseadas no histórico.

  • Para revisar as otimizações baseadas em histórico de um job usando a visualização INFORMATION_SCHEMA.JOBS, é preciso ter o papel necessário. Para mais informações, consulte Papel necessário para a visualização INFORMATION_SCHEMA.JOBS.