Entenda a filtragem adaptativa na IA do AlloyDB

Nesta página, apresentamos uma visão geral conceitual da filtragem adaptativa na AlloyDB AI, um recurso projetado para otimizar pesquisas vetoriais filtradas.

O que é a filtragem adaptativa?

A filtragem adaptativa analisa padrões de consulta e distribuições de dados durante a execução da consulta para escolher dinamicamente a estratégia de filtragem mais eficiente, como filtragem inline ou pré-filtragem.

O otimizador de consultas da IA do AlloyDB usa a análise baseada em custos para determinar se a filtragem inline ou a pré-filtragem oferece o melhor desempenho em qualquer ponto durante a execução da consulta.

Esse tipo de otimização é compatível com as pesquisas vetoriais filtradas da IA do AlloyDB, em que a filtragem adaptativa alterna automaticamente entre o uso de vetores e índices de metadados, o que produz resultados eficientes e precisos sem intervenção manual.

Troca dinâmica entre estratégias de filtragem

A filtragem adaptativa muda automaticamente e de forma dinâmica entre as estratégias de filtragem inline e pré-filtragem durante a execução da consulta com base em padrões de consulta e distribuições de dados em tempo real. O otimizador de consultas de IA do AlloyDB usa a análise baseada em custos para determinar qual estratégia oferece o melhor desempenho em qualquer ponto.

Do inline à pré-filtragem

Quando o otimizador determina que a pré-filtragem é mais eficiente, a filtragem adaptativa aciona uma mudança da filtragem inline para a pré-filtragem durante a execução. O plano de consulta muda dinamicamente para refletir isso.

Por exemplo, o plano pode mostrar Bitmap assisted pre-filtering no campo Estratégia de Execução quando o otimizador determina que a pré-filtragem é mais eficiente naquele ponto da consulta. Essa alteração dinâmica ocorre à medida que o sistema se adapta aos dados reais encontrados durante a execução da consulta.

Limit (actual rows=10 loops=1)
  ->  Custom Scan (vector scan) on t1 (actual rows=10 loops=1)
        Execution Strategy: Bitmap assisted pre-filtering
        Order By: (vec_col <=> '[...]'::vector)
        Limit: 10
        ->  Bitmap Index Scan on btree_idx (actual rows=10000 loops=1)
              Index Cond: (int_col <= 100000000)

Ao usar o Execution Strategy: Bitmap assisted pre-filtering, um Bitmap Index Scan separado primeiro filtra um grande conjunto de dados. Se essa pré-filtragem reduzir os candidatos de maneira eficaz, o índice de vetor não será usado na pesquisa final de similaridade vetorial.

Da pré-filtragem à filtragem inline

A filtragem adaptativa também pode mudar dinamicamente da pré-filtragem para a filtragem inline se o otimizador de consultas da IA do AlloyDB determinar que a filtragem inline é mais eficiente para as características da consulta atual.

Nesses casos, o plano de consulta se ajusta dinamicamente para refletir um processamento mais direto dos dados vetoriais sem uma etapa explícita de pré-filtragem antes da verificação de vetores. Essa adaptabilidade ajuda a alcançar o desempenho ideal à medida que as distribuições de dados ou os parâmetros de consulta mudam durante a execução.

Por exemplo, o plano de consulta mostra vector scan no campo Estratégia de execução quando o otimizador determina que uma estratégia de filtragem inline é mais eficiente para a consulta em questão.

Limit (actual rows=10 loops=1)
  ->  Custom Scan (vector scan) on t1 (actual rows=10 loops=1)
        Execution Strategy: Bitmap assisted vector Scan on scann_idx
        Order By: (vec_col <=> '[...]'::vector)
        Limit: 10
        Num Requalifications: 0
        Num filtered: 1000
        ->  Bitmap Index Scan on btree_idx (actual rows=10000 loops=1)
              Index Cond: (int_col <= 100000000)

Neste exemplo, o Execution Strategy mostra Bitmap assisted vector Scan on scann_idx, com um Bitmap Index Scan subjacente em btree_idx. Isso indica que a pesquisa de vetor usa um filtro de bitmap, que a verificação de índice de bitmap gera com base na condição int_col <= 100000000. O Custom Scan (vector scan) processa apenas as linhas identificadas por esse bitmap, integrando a filtragem diretamente ao processo de verificação de vetor.

Exemplo: como a seletividade aciona uma troca dinâmica

A filtragem adaptativa baseia as decisões na seletividade dos seus filtros padrão. Se um filtro eliminar uma grande quantidade de dados, o otimizador provavelmente vai escolher a pré-filtragem. Se o filtro deixar a maior parte dos dados intacta, o otimizador provavelmente vai escolher a filtragem inline.

É possível observar essa troca dinâmica em tempo real executando a mesma consulta e ajustando a seletividade da cláusula WHERE.

Por exemplo, ao consultar uma tabela grande de produtos de varejo, talvez você queira fazer uma pesquisa vetorial apenas em itens com um preço específico.

Baixa seletividade

Primeiro, pesquise produtos com preço inferior a US $1.000. Como quase todos os produtos no banco de dados custam menos de US $1.000, o filtro tem baixa seletividade. O otimizador de consultas da AlloyDB AI determina que reunir quase todo o banco de dados em uma lista pré-filtrada é ineficiente. Por isso, ele realiza uma verificação de vetor inline.

Se você analisar o plano de consulta, vai notar que o sistema se adaptou dinamicamente ao conjunto de dados enorme e escolheu a filtragem inline.

  Limit (actual rows=10)
    -> Custom Scan (vector scan)
    Execution Strategy: Bitmap assisted vector Scan on scann_idx
    Order By: (vec <=> '[...]'::vector)
    -> Bitmap Index Scan
       Index Cond: (price <= 1000)

Alta seletividade

Em seguida, mude a consulta para pesquisar produtos com preço inferior a US $10. Quando a consulta começa a ser executada, o otimizador de consultas da IA do AlloyDB se prepara para usar a filtragem inline. O planejador assume incorretamente que o filtro não é muito seletivo. Isso acontece com mais frequência do que o esperado porque as estatísticas usadas para fazer essas estimativas nem sempre são precisas ou atualizadas. No entanto, ele determina rapidamente que o filtro de preço tem alta seletividade: muito poucos itens no banco de dados têm esse preço baixo. O otimizador determina que coletar essas poucas linhas antes de realizar a verificação de vetor é muito mais rápido. Por isso, ele muda dinamicamente as estratégias para a pré-filtragem.

O plano de consulta reflete essa mudança em tempo real. O sistema optou por pré-filtrar o pequeno conjunto de dados antes de verificar os vetores.

Escolha inicial do planejador

Limit (actual rows=10)
  -> Custom Scan (vector scan)
     Execution Strategy: Bitmap assisted vector Scan on scann_idx
     Order By: (vec <=> '[...]'::vector)
     -> Bitmap Index Scan
        Index Cond: (price <= 10)

Execução real (interruptor adaptativo)

Limit (actual rows=10)
  -> Custom Scan (vector scan)
     Execution Strategy: Bitmap assisted pre-filtering
     Order By: (vec <=> '[...]'::vector)
     -> Bitmap Index Scan
        Index Cond: (price <= 10)

Não é necessário reescrever o código do aplicativo nem atualizar manualmente os índices do banco de dados à medida que a distribuição dos dados muda com o tempo. O AlloyDB AI processa a lógica de roteamento para você em todas as consultas, garantindo alto desempenho.

A seguir