Todos os produtos
Search
Central de documentação

PolarDB:Transformação de consulta baseada em custo

Última atualização: Jun 28, 2026

O PolarDB for MySQL usa a transformação de consulta baseada em custo (CBQT) para reescrever consultas complexas em formas equivalentes com menor custo de execução. Diferentemente das transformações baseadas em regras, aplicadas incondicionalmente, o CBQT avalia várias estratégias de reescrita e seleciona a de menor custo estimado, considerando cardinalidade, métodos de acesso e ordem de junção.

Pré-requisitos

Antes de usar o CBQT, verifique a versão do seu cluster:

  • Versão antiga do CBQT: PolarDB for MySQL 8.0.2, revisão 8.0.2.2.0 ou posterior

  • Nova versão do CBQT: PolarDB for MySQL 8.0.2, revisão 8.0.2.2.19 ou posterior

Para verificar a versão da revisão, consulte Consultar a versão do mecanismo.

Como funciona

A transformação de consulta reescreve uma instrução SQL em outra equivalente. Por exemplo:

SELECT *
FROM d1
    JOIN f1 ON d1.c1 = f1.c1
    LEFT JOIN (
        SELECT d2.c2 AS d2_c2, f2.c3 AS f2_c3
        FROM d2, f2
        WHERE d2.c1 = f2.c1
    ) derived
    ON derived.d2_c2 = d1.c2
        AND derived.f2_c3 = f1.c3;

Após a mesclagem de tabela materializada, a consulta torna-se:

SELECT *
FROM d1
    JOIN f1 ON d1.c1 = f1.c1
    LEFT JOIN (d2
        JOIN f2 ON TRUE)
    ON d2.c1 = f2.c1
        AND f2.c3 = f1.c3
        AND d2.c2 = d1.c2;

O MySQL Community Edition aplica essa transformação incondicionalmente com base em regras de equivalência, sem verificar se ela reduz o custo. Se os índices de d1/f1 e d2/f2 não estiverem correlacionados, a mesclagem força cada linha da junção d1-f1 a acionar uma junção d2-f2 separada, o que pode aumentar significativamente o tempo de execução.

O CBQT resolve esse problema ao construir um espaço de estados com todas as combinações possíveis de transformações antes de adotar qualquer uma delas. Para duas transformações candidatas A e B, o espaço de estados contém quatro combinações: Nenhuma, Apenas A, Apenas B e AB. O CBQT estima o custo de execução de cada combinação e seleciona o plano de menor custo.

image

No exemplo de mesclagem de tabela materializada, o plano de execução após a mesclagem tem a seguinte aparência:

image

O plano de execução antes da mesclagem apresenta este formato:

image

A vantagem do plano mesclado depende da correlação entre os índices de d2/f2 e d1/f1, bem como do tamanho do conjunto de resultados da junção. O CBQT calcula ambos os custos e aplica a transformação apenas se houver redução de custo.

Transformações que sempre reduzem o custo são tratadas como baseadas em regras e aplicadas sempre que as condições relevantes forem atendidas.

Conceitos principais

Consulta aninhada e profundidade de aninhamento

Uma consulta aninhada é um bloco de consulta inserido dentro de outro. O bloco interno é a subconsulta (ou consulta interna); o bloco externo é a consulta pai (ou consulta externa). A profundidade de aninhamento corresponde ao número de camadas aninhadas.

Exemplo com profundidade de aninhamento 2:

SELECT * FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2 WHERE t2.c = t1.b);

O operador UNION combina instruções no mesmo nível de aninhamento. A consulta a seguir possui profundidade de aninhamento 3:

SELECT *
FROM t1
WHERE t1.a IN (
    SELECT dt.b
    FROM (
        SELECT b, c FROM t2
        UNION
        SELECT b, c FROM t3
    ) dt
    WHERE dt.c = t1.b
);

Transformação

Processo de reescrita de uma consulta em uma forma equivalente, como a mesclagem de tabela materializada mostrada acima.

Objeto de transformação

Elemento da consulta ao qual uma regra de transformação se aplica. Na mesclagem de tabela materializada, o objeto é a própria tabela materializada. Na transformação de subconsulta para SEMI JOIN, o objeto é a subconsulta.

Iteração

Cada passagem sobre todos os objetos de transformação constitui uma iteração. Após aplicar uma transformação, novos objetos podem se tornar elegíveis para transformações adicionais. Por exemplo, uma subconsulta convertida em tabela materializada pode ser mesclada. O CBQT repete o processo até que nenhuma nova transformação seja possível ou até atingir o limite de iterações.

Ativar e configurar o CBQT

Dois parâmetros controlam o CBQT globalmente:

Parâmetro

Nível

Padrão

Descrição

cbqt_enabled

Global e sessão

ON

Ativa ou desativa o CBQT. Valores válidos: ON, OFF, REPLICA_ON (ative o CBQT apenas em nós somente leitura)

cbqt_version

Global e sessão

1

Selecione a versão do CBQT. 1 = versão antiga, 2 = nova versão

Versão antiga do CBQT

A versão antiga está disponível a partir da revisão 8.0.2.2.0.

O CBQT pode levar tempo para avaliar todas as combinações no espaço de estados. Para proteger consultas de curta duração, defina um limiar de custo: o CBQT ativa apenas quando o custo estimado da consulta excede cbqt_cost_threshold.

Para subconsultas correlacionadas cujo unnesting o MySQL Community Edition não suporta, a versão antiga remove a correlação usando cláusulas GROUP BY.

Para transformações que o MySQL Community Edition aplica incondicionalmente, você pode optar pela avaliação baseada em custo. O recurso de mesclagem de derivadas é controlado pelo sinalizador derived_merge_cost_based em polar_optimizer_switch.

Parâmetros

Parâmetro

Nível

Padrão

Descrição

cbqt_cost_threshold

Global e sessão

100000

Custo mínimo de consulta que aciona o CBQT. Consultas com custos estimados inferiores são ignoradas. Valores válidos: 0–18446744073709551615

cbqt_timeout

Global e sessão

200 ms

Tempo máximo dedicado à busca pelo plano ideal. Se o tempo limite expirar, o CBQT usa o melhor plano encontrado até o momento. Defina como 0 para desativar o tempo limite. Valores válidos: 0–18446744073709551615

polar_optimizer_switch

Global e sessão

Conjunto de sinalizadores que controlam recursos individuais de otimização. Consulte a tabela a seguir para ver os sinalizadores válidos

Sinalizadores de polar_optimizer_switch:

Sinalizador

Padrão

Descrição

unnest_use_window_function

ON

Remove a correlação de subconsultas usando funções de janela

unnest_use_group_by

ON

Remove a correlação de subconsultas usando cláusulas GROUP BY (baseado em custo)

derived_merge_cost_based

OFF

Aplica a mesclagem de derivadas com base no custo, em vez de fazê-lo incondicionalmente

Nova versão do CBQT

Disponível a partir da revisão 8.0.2.2.19, a nova versão introduz controle mais granular sobre contagem de iterações, profundidade de aninhamento, estratégia de busca e regras individuais de transformação.

Parâmetros

Parâmetro

Nível

Padrão

Descrição

cbqt_iteration_limit

Global

1

Número máximo de iterações do CBQT. Valores mais altos aumentam a chance de encontrar o plano ideal, mas consomem mais tempo. Valores válidos: 1–10

cbqt_max_nested_level

Global e sessão

5

Profundidade máxima de aninhamento processada pelo CBQT. Consultas mais profundas que esse valor não sofrem transformação. Valores válidos: 1–64

cbqt_search_strategy

Global

auto

Estratégia para seleção do plano ideal. Consulte a tabela a seguir para ver os valores válidos

cbqt_rule_switch

Global e sessão

Conjunto de sinalizadores que ativam ou desativam regras individuais de transformação. Consulte a tabela a seguir para ver os sinalizadores válidos

Valores de cbqt_search_strategy:

Valor

Descrição

auto

Busca adaptativa (padrão). O PolarDB seleciona linear ou twoPass com base na consulta

linear

Compara o custo de execução antes e depois de cada transformação independentemente e mantém o melhor plano

twoPass

Compara o custo de aplicar todas as transformações uniformemente versus não aplicar nenhuma e seleciona a melhor abordagem

Sinalizadores de cbqt_rule_switch (todos com padrão ON):

Sinalizador

Descrição

merge_derived

Mesclagem de tabela materializada baseada em custo

subquery_to_derived

Transformação baseada em custo de subconsulta para tabela materializada

unnest_subquery_by_groupby

Remoção de correlação baseada em custo usando cláusulas GROUP BY

unnest_subquery_by_windows

Remoção de correlação usando funções de janela

derived_projection_pruning

Poda de projeção de tabela materializada

cond_pushdown

Pushdown de condição

heuristic_merge_derived

Mesclagem heurística de tabela materializada

subquery_to_semijoin

Transformação de subconsulta para SEMI JOIN

heuristic_coalesce_subquery

Agrupamento heurístico de subconsulta

coalesce_subquery

Agrupamento de subconsulta baseado em custo