O otimizador estima os custos de execução com base em estatísticas e dados amostrados. Quando essas estimativas divergem significativamente dos valores reais durante a execução, o otimizador pode escolher um plano de execução subótimo. A troca adaptativa de plano de execução detecta essa divergência em tempo de execução e muda automaticamente para um plano melhor, sem necessidade de intervenção manual.
Há suporte para dois modos:
Roteamento adaptativo linha-coluna: redireciona consultas lentas dos nós de armazenamento em linha para os nós de armazenamento em coluna (IMCI) quando o volume real de varredura excede o limiar estimado.
Seleção adaptativa de índices ordenados: transfere a execução para o armazenamento em coluna quando as linhas reais verificadas em um índice ordenado (selecionado pela otimização
prefer_ordering_index) ultrapassam o limiar. Isso evita sobrecarga desnecessária de I/O e CPU.
Como funciona
Ambos os modos seguem o mesmo mecanismo de três fases:
Fase de otimização: o otimizador define limiares de contagem de linhas para cada bloco de consulta e para a consulta inteira e os adiciona aos metadados de monitoramento. Caso o otimizador não selecione o IMCI ou escolha um índice ordenado devido ao
prefer_ordering_index, ele calcula o limiar necessário para acionar a troca de plano.Fase de execução: durante a execução da consulta, o banco de dados rastreia as linhas verificadas no caminho crítico usando apenas comparações de inteiros, sem gerar sobrecarga de desempenho. Ao atingir o limiar de linhas verificadas, o sistema avalia se deve mudar para um plano alternativo.
Troca de plano: antes de trocar, o banco de dados garante que nenhum resultado parcial foi retornado ao cliente. Após a mudança, ele limpa quaisquer resultados intermediários em cache e continua a execução sob o novo plano.
Em clusters com a versão 8.0.1.1.49 ou posterior (ou 8.0.2.2.29 ou posterior), o parâmetro loose_adaptive_cost_threshold_for_imci controla o limiar para roteamento adaptativo linha-coluna. Em versões anteriores, esse valor é derivado de loose_cost_threshold_for_imci.
O diagrama a seguir ilustra o fluxo do roteamento adaptativo linha-coluna.
Pré-requisitos
Antes de ativar a troca adaptativa de plano de execução, verifique se o cluster atende aos requisitos de versão do modo desejado.
Roteamento adaptativo linha-coluna (imci_chosen=on):
PolarDB for MySQL 8.0.1, versão de revisão 8.0.1.1.39 ou posterior
PolarDB for MySQL 8.0.2, versão de revisão 8.0.2.2.29 ou posterior
Seleção adaptativa de índices ordenados (ordering_index=on):
PolarDB for MySQL 8.0.1, versão de revisão 8.0.1.1.47 ou posterior
PolarDB for MySQL 8.0.2, versão de revisão 8.0.2.2.29 ou posterior
Ativar ou desativar a troca adaptativa de plano de execução
Faça login no console do PolarDB e acesse a página Parameters do cluster. Para obter as etapas de configuração, consulte Configurar parâmetros de cluster e nó.
Defina loose_adaptive_plans_switch com um dos seguintes valores:
'imci_chosen=on'— ativa o roteamento adaptativo linha-coluna'ordering_index=on'— ativa a seleção adaptativa de índices ordenados'imci_chosen=on,ordering_index=on'— ativa ambos os modosDefina qualquer subchave como
'off'para desativar o modo correspondente
A tabela a seguir descreve todos os parâmetros configuráveis.
|
Parâmetro |
Escopo |
Descrição |
Versão mínima |
|
|
Global/Sessão |
Controla quais modos de troca adaptativa estão ativos. Subchaves: |
8.0.1.1.39 (imci_chosen) / 8.0.1.1.47 (ordering_index) |
|
|
Global/Sessão |
Limiar de custo para acionar o roteamento adaptativo linha-coluna. Valores válidos: 1–18.446.744.073.709.551.615. Padrão: |
8.0.1.1.49 ou 8.0.2.2.29 |
|
|
Global/Sessão |
Tempo máximo de execução (ms) para que uma consulta seja elegível à troca adaptativa de plano. Se a consulta executar por mais tempo que este valor antes de atingir o limiar de linhas, nenhuma troca de plano ocorrerá. Valores válidos: 0–1.800.000. Padrão: |
— |
|
|
Global/Sessão |
Ponto de verificação de varredura de linhas para a seleção adaptativa de índices ordenados. Um valor menor causa verificações mais frequentes e trocas antecipadas. Valores válidos: 0–4.294.967.295. Padrão: |
— |
Por que as soluções padrão são insuficientes
Antes da disponibilidade da troca adaptativa de plano de execução, corrigir consultas mal roteadas ou seleção inadequada de índices exigia uma das duas abordagens manuais:
Reduzir globalmente o limiar de custo do armazenamento em coluna: essa opção roteia mais consultas para os nós de armazenamento em coluna, mas também envia consultas curtas e leves para o IMCI. Consequentemente, aumenta a carga nos nós de armazenamento em coluna e pode bloquear outras cargas de trabalho.
-
Usar statement outline para corrigir modelos de consulta específicos: o recurso statement outline pode forçar uma consulta específica a usar o armazenamento em coluna ou desativar o
prefer_ordering_index:-- Force a query to use column store CALL dbms_outln.add_optimizer_outline("<schema_name>", "/*+ SET_VAR(cost_threshold_for_imci=0) SET_VAR(imci_ap_threshold=0) */", "<query>"); -- Disable prefer_ordering_index for a specific query template CALL dbms_outln.add_optimizer_outline("<schema_name>", "/*+ SET_VAR(optimizer_switch='prefer_ordering_index=off') */", "<query>");Embora precisa, essa abordagem adiciona custos operacionais significativos, pois cada modelo de consulta problemático deve ser identificado e gerenciado individualmente.
A troca adaptativa de plano de execução resolve ambos os problemas automaticamente: ela alterna os planos apenas quando os dados reais de execução confirmam que a estimativa do otimizador estava incorreta e mantém inalteradas as consultas com estimativas corretas.
Quando usar cada abordagem: utilize loose_adaptive_plans_switch (automático) como padrão, pois não requer configuração por consulta e responde às evidências de tempo de execução. Recorra ao statement outline (manual) quando precisar de comportamento determinístico para um modelo de consulta específico, independentemente das estatísticas de execução.
Verificar a atividade de troca adaptativa
Execute a seguinte instrução para verificar o número total de trocas adaptativas de plano desde a ativação do recurso:
SHOW GLOBAL STATUS LIKE 'Adaptive_plan_used';
|
Variável |
Escopo |
Descrição |
|
|
Global |
Número total de trocas adaptativas de plano realizadas desde a ativação do recurso. |