Consulta SQL++ / N1QL

Aumente a eficiência da consulta com a otimização baseada em custo no Couchbase

Os usuários de bancos de dados de todos os tipos esperam uma otimização baseada em custos para suas consultas.

Esse é um recurso padrão de todos os bancos de dados relacionais tradicionais (RDBMS), mas ainda não existe um otimizador baseado em custo (CBO) para bancos de dados de documentos NoSQL. Isto é, até agora.

A otimização baseada em custos para consultas do Couchbase foi lançada como Developer Preview no Couchbase 6.5, e agora está pronto para disponibilidade geral com o Couchbase 7.0.

Vamos dar uma olhada mais de perto nos novos recursos de CBO do Couchbase Server 7.0.

A maneira antiga: Otimização baseada em regras

É impossível discutir a otimização baseada em custos sem fazer referência à abordagem anterior da otimização de consultas a bancos de dados: a otimização baseada em regras (RBO).

Com a otimização baseada em regras, o otimizador de consultas considera o uso de qualquer que fornece um caminho para recuperar o resultado da consulta. No entanto, quando o otimizador recebe mais de um caminho para processar a consulta, ou seja, quando a consulta pode usar vários índices, ele pode acabar usando todos índices.

Com a otimização baseada em custos, o otimizador de consultas calcula o custo do uso de cada índice e, em seguida, decide o plano de execução com o menor custo.

O que é otimização baseada em custos?

A otimização baseada em custos permite que o otimizador de consultas do banco de dados escolha o melhor plano (de menor custo) para processar uma consulta.

Isso é mais importante sempre que uma consulta tiver mais de um caminho de execução em potencial, ou seja, mais de um índice qualificado. A cada caminho de plano de consulta é atribuído um custo total para todas as operações que a consulta precisa executar. Esses custos dependem particularmente da seletividade dos predicados especificados. Para chegar ao valor de seletividade de um predicado, as estatísticas dos campos do predicado precisam ter sido pré-computadas.

Observe que o valor do custo é uma unidade arbitrária de cálculo estatístico: ele não equivale ao custo do recurso ou ao uso da CPU.

Otimização baseada em custos versus otimização baseada em regras

A otimização de consultas com base no custo sempre oferece um caminho de execução melhor quando o otimizador é apresentado a mais de uma opção. As estatísticas computadas garantem que o otimizador esteja equipado com o conhecimento sobre a distribuição de dados e, consequentemente, sobre a eficiência de um plano de consulta em relação a outro.

Por exemplo, imagine uma coleção do Couchbase que contém informações sobre os clientes e seus endereços, com um índice sobre ix1(código postal) e ix2(cidade). Estatisticamente, há mais CEPs do que cidades nos Estados Unidos. Mas isso não significa necessariamente que usar o código de endereçamento postal seja uma forma de se obter um resultado positivo. ix1(código postal) tem um custo menor (e, portanto, melhor desempenho) do que o índice ix2(cidade) índice. Por quê? Porque ainda não sabemos se os clientes do sistema estão distribuídos uniformemente em todas as cidades e códigos postais dos EUA. É provável que não sejam.

Nesse cenário, são as estatísticas coletadas previamente pelo otimizador baseado em custo que o ajudam a decidir o caminho de consulta de menor custo em tempo de execução.

Com a otimização baseada em regras, se uma consulta tiver predicados de cidade e CEP, o otimizador de consultas usará os dois índices com a varredura de interseção. No entanto, o CBO usa apenas um índice - o que tiver o menor custo com base nos dados da coleção.

Como habilitar a otimização baseada em custo no Couchbase

Há duas etapas importantes que você precisa seguir para usar a otimização baseada em custo no Couchbase Server 7.0:

1. Ativar o recurso CBO

Atualmente, o otimizador baseado em custo está ativado por padrão no Couchbase 7.0.

No entanto, você pode desativá-lo com o comando N1QL Valor do controle de recursos em Configurações->Configurações de consulta. Se você planeja usar a otimização baseada em custo, certifique-se de que ela esteja ativada.

2. Coletar estatísticas

Além de ter o otimizador baseado em custo ativado em seu cluster, você também deve ter coletado estatísticas sobre os campos subjacentes dos índices usados por suas consultas. Aqui está um exemplo de consulta sobre como fazer isso:

Por exemplo, usando o amostra de viagem essa consulta acima teria a seguinte aparência:

Você também pode coletar as estatísticas de acordo com o nome do índice:

Observe que você também pode desativar o otimizador baseado em custos usando a opção cbo_flag em sua API, ou excluindo as estatísticas com UPDATE STATISTICS DELETE (,...).

O balde do sistema CBO

Quando tiver ativado a otimização baseada em custo e coletado estatísticas, você notará um Bucket adicional em seu cluster chamado N1QL_SYSTEM_BUCKET.N1QL_SYSTEM_SCOPE.N1QL_CBO_STAT. O acesso direto a esse Bucket é restrito aos administradores do sistema.

Usando o ESTATÍSTICAS DE ATUALIZAÇÃO você pode adicionar mais estatísticas ao Bucket ou excluir as estatísticas com o comando Estatísticas de atualização para DELETE.

Otimizador baseado em custo em ação

Vamos dar uma olhada mais de perto em como a otimização baseada em custo funciona no Couchbase 7.0 usando o amostra de viagem no cenário a seguir.

Seleção aprimorada de índices com otimização baseada em custos

Digamos que você tenha definido dois índices para o amostra de viagem._default.airport Coleção.

E você tem uma pergunta abaixo:

Se a otimização baseada em custo acima não fosse usada, o plano de execução do otimizador baseado em regras para a consulta acima seria:

rules-based optimization execution plan for Couchbase N1QL query

Observe que, como os predicados de consulta estão em ambos os cidade e faa ambos os índices são usados na varredura de interseção. Saiba mais sobre varreduras de interseção neste artigo: Ingredientes de desempenho para NoSQL: Varreduras de interseção no N1QL.

Em seguida, você habilita a otimização baseada em custo para a consulta ao banco de dados. Como a CBO já está ativada por padrão, tudo o que você precisa fazer é coletar as estatísticas.

Depois que as estatísticas forem coletadas, execute o comando SELECIONAR perguntar novamente.

Você verá que o plano de execução muda para usar apenas o aeroporto.faa índice. Essa alteração ocorre porque as estatísticas estão informando ao otimizador que o índice faa tem uma seletividade melhor em comparação com o campo cidade campo. Portanto, o aeroporto.faa é o índice mais eficiente a ser usado pela consulta.

Couchbase cost-based optimization execution plan for N1QL query

Um JOIN melhor com otimização baseada em custos

Vejamos outro exemplo de otimização de consulta baseada em custo que ilustra como o otimizador baseado em custo escolhe um tipo de JOIN melhor entre aeroporto e rota.

Primeiro, criamos um índice para rastrear o aeroporto de origem:

E então usamos a consulta abaixo:

Com o antigo otimizador baseado em regras, o plano de execução da consulta acima teria a seguinte aparência:

rules-based optimization execution plan for database JOIN

Observe que o plano de execução do RBO acima usa um loop aninhado para unir a coleção de aeroportos à coleção de rotas.

Em seguida, você precisa ativar a otimização baseada em custo para a consulta. Como a CBO já está ativada por padrão, tudo o que você precisa fazer é coletar as estatísticas do campo na Collection.

Com as estatísticas de otimização baseadas em custo disponíveis nos dois campos subjacentes para os índices, o otimizador passa a usar um HASH para a coleção JOIN.

Couchbase CBO optimizer query execution plan using a HASH for the Collection JOIN

Solução de problemas do otimizador baseado em custo no Couchbase

  1. A otimização baseada em custo é ativada por padrão no Couchbase 7.0. No entanto, as estatísticas precisam estar presentes nos campos específicos do seu Bucket/Collections para que o otimizador baseado em custo funcione de forma eficaz.
  2. Você pode desativar a otimização baseada em custo no nível do cluster usando o campo Controle de recursos N1QL adicionando 16 ao valor. É um conjunto com x10 bits.
  3. As estatísticas de CBO não são atualizadas automaticamente pelo Serviço de Consulta. Você deve coletar estatísticas regularmente ou após uma alteração significativa no conteúdo da sua coleção. Recomendo a coleta de estatísticas após um grande upload de dados; caso contrário, uma execução semanal deve ser suficiente.
  4. A otimização baseada em custos só é considerada para uma consulta se as estatísticas estiverem disponíveis para todos os índices que estavam sendo considerados pelo otimizador. Você pode coletar as estatísticas de todos os índices em um determinado espaço-chave usando o seguinte:

Mais recursos

Para saber mais sobre o otimizador baseado em custo para JSON - e sobre a versão 7.0 do Couchbase em geral - confira os seguintes recursos:

Deseja conhecer a otimização baseada em custos com o Couchbase?Introdução ao Couchbase 7.0

 

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Binh Le

Binh Le é gerente de produto principal do serviço de consulta do Couchbase. Antes da Couchbase, ele trabalhou na Oracle e liderou a equipe de gerenciamento de produtos para Sales Clould Analytics e CRM OnDemand. Binh é bacharel em Ciência da Computação pela Universidade de Brighton, no Reino Unido.

Um comentário

  1. Ótimo artigo, obrigado. Um pequeno erro de digitação no último parágrafo da seção "A better JOIN with CBO". A palavra NÃO deveria ser AGORA. Como em

    ..., o otimizador passará a usar um HASH para a coleção JOIN.

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.