O consultor de índice para declaração N1QL (declaração ADVISE) foi lançado oficialmente no Couchbase Server 6.6.
Ele foi projetado para para fazer melhores esforços para fornecer índice secundário global recomendação para cada Espaço-chave na consulta, que é melhor do que todos os índices atuais existentes e os índices em construção adiada.
Vamos ver mais algumas explicações sobre as partes destacadas da funcionalidade:
-
- Melhores esforços:
- Não há garantia de integridade: não há recomendações de índices quando não há predicados nem filtros derivados.
- Correção sem falso positivo.
- Recomenda apenas índices GSI, sem recomendações de índices primários.
- A recomendação de índice é para cada espaço-chave envolvido na consulta.
- Melhor: O otimizador de consultas preferirá o índice recomendado a todos os outros índices existentes na execução da consulta. No entanto, não é garantido que o índice recomendado seja o índice ideal para a consulta. Na versão atual, o consultor de índices só aconselha o otimizador de consultas baseado em regras. O suporte para o otimizador de consultas baseado em custos estará disponível na próxima versão.
- Melhores esforços:
Para aumentar a robustez da funcionalidade acima e trazer continuamente aprimoramentos para o consultor de índices, alguns recursos inovadores foram introduzidos nesta versão. Este artigo se aprofundará nos detalhes de design de vários deles.
Estrutura de verificação de índice virtual
Para uma recomendação de índice de cobertura, garantir a correção da propriedade de cobertura é muito difícil devido à complexidade dos objetos aninhados nos índices ARRAY para os predicados ARRAY e a operação UNNEST. Para Para garantir que o índice de cobertura recomendado possa criar uma varredura de cobertura real na execução da consulta, foi introduzida uma nova estrutura de feedback para fins de verificação.
Conforme mostrado no diagrama abaixo, o consultor de índices cria índices GSI virtuais para os candidatos a índices de cobertura recomendados e fornece feedback ao otimizador de consultas para verificar se eles seriam selecionados pelo otimizador entre todos os outros índices existentes para gerar um plano de execução. O Virtual Index é uma estrutura de dados na memória para imitar os metadados de um índice normal e permite que o otimizador o considere da mesma forma que os outros índices normais ao gerar operadores de varredura de índice. Se o índice virtual aparecer em um operador de varredura de cobertura na fase de verificação, estamos confiantes em devolvê-lo, pois ele se comportará da mesma forma depois de criado pelos usuários.

Ao mesmo tempo, o loop de feedback de verificação também ajuda a avaliar as propriedades de pushdown dos índices de cobertura recomendados. Há um novo campo na saída dos índices de cobertura como "index_property" para fornecer as propriedades de pushdown do índice, como segue:
-
- LIMIT pushdown
- OFFSET pushdown
- ORDEM pushdown
- Empurrar GROUPBY e AGREGADOS
- pushdown FULL GROUPBY & AGGREGATES
Com essa função configurada, estamos prontos para explorar as novas áreas, conforme discutido abaixo.
Flexões de índice em recomendações de índice de cobertura
Os pushdowns de índice são otimizações de desempenho nas quais o mecanismo de consulta transfere mais trabalho para o indexador.
O consultor de índices se esforça ao máximo para explorar a possibilidade de recomendar índices de cobertura com propriedades de pushdown mais altas, a fim de melhorar ainda mais o desempenho da consulta.
Conforme mostrado no diagrama abaixo, três tipos de pushdowns serão aplicados sobre o índice de cobertura: GROUP BY/aggregate, ORDER BY e limit/offset, quando aplicável. Vamos examinar os detalhes de cada um deles.

Agrupamento de índices/agregados
O Index Advisor segue o design do Agrupamento e agregação de índices nos seguintes aspectos:
-
- Suporta seis tipos de agregações: MIN, MAX, AVG, SUM, COUNT e COUNTN.
- Melhores esforços para ajustar a ordem das chaves de índice para obter agregação total/parcial para melhorar o desempenho.
- A agregação total refere-se ao cenário em que o indexador lida com a agregação completa do grupo, permitindo que o mecanismo de consulta ignore todo esse operador.
- Na agregação parcial, O indexador envia a agregação parcial do grupo para a consulta e responde à consulta para mesclar os resultados intermediários e criar o grupo final e o operador de agregação.
-
- Tratamento especial para agregação DISTINCT, que só é possível quando se aplicam pushdowns completos.
Pré-requisitos:
-
- Todos os predicados são traduzidos exatamente para varreduras de intervalo com um índice de cobertura, sem JOIN ou NEST na consulta.
Como funciona para Agregados sem DISTINCT:
-
- Gerar chaves de índice com base em predicados, seguindo as regras de recomendação de índice.
- Ajustar as posições das chaves GROUP BY para que sejam equivalentes/dependentes das chaves de índice principais, ignorando as dos predicados de igualdade, enquanto tordem dentro dessas chaves GROUP BY não importa.
- Para as expressões GROUP BY que não sejam equivalentes ou dependentes das chaves de índice, acrescente-as às chaves de índice.
- Para as expressões GROUP BY equivalentes à condição de índice, mova a condição de índice para as chaves de índice.
- Anexar projeções para gerar um índice de cobertura, com umAs expressões ggregate podem estar em qualquer lugar nas chaves do índice ou depender das chaves do índice ou meta().id.
Como funciona para Agregados com DISTINCT :
-
- Somente quando se aplica o pushdown total.
- As mesmas regras acima se aplicam às expressões GROUP BY.
- As expressões agregadas distintas devem ser equivalentes/dependentes de (n+1) chaves de índice principais, ignorando as chaves de predicados de igualdade, em que n representa o número de itens GROUP BY.
Pedido de índice
Quando as chaves ORDER BY estão alinhadas com a ordem das chaves do índice, o otimizador de consultas pode ignorar a geração do operador ORDER BY. O Index Advisor se esforça ao máximo para fazer o ajuste de acordo.
-
- Realocar as chaves do índice ORDER BY sobre os pushdowns GROUP BY/Aggregate ou índices de cobertura normais se GROUP BY não existir para gerar índices com propriedades pushdown ORDER BY.
- Aplicar somente em cima de pushdowns FULL GROUP BY/Aggregate.
- As expressões ORDER BY seguem a ordem das chaves de índice, ignorando as chaves dos predicados de igualdade.
- Quando o termo ORDER BY puder ser empurrado para baixo, adicione "DESC" ao termo que tem ordem decrescente.
- Diferentemente dos pushdowns GROUP BY/Aggregate, a ordem dentro dos termos ORDER BY é importante. Nos cenários em que GROUP BY e ORDER BY existirem na consulta, mas os pushdowns de índice não puderem ser atendidos juntos, o Index advisor os processará separadamente e contará com a estrutura de verificação mencionada acima para escolher o melhor.
Paginações
O consultor de índices não tem um processamento específico para pushdowns de limite/offset; na verdade, ele será aplicado sobre os dois pushdowns anteriores, se houver algum deles, ou aplicado diretamente ao índice de cobertura original.
Vamos examinar vários exemplos, conforme mostrado abaixo, nos quais a propriedade pushdown será verificada pelo loop de feedback do índice virtual e mostrada na "pushdown_property", se aplicável.
Exemplo 1:
|
1 2 3 4 |
CONSELHO SELECIONAR soma(d) DE shellTest ONDE a = 10 e b < 10 e c é não nulo GRUPO BY c |
A saída do índice de cobertura é mostrada abaixo, na qual a expressão GROUP BY "c" foi ajustada para ficar logo após a chave de índice "a", que vem do predicado de igualdade.
|
1 2 3 4 5 6 7 |
"covering_indexes": [ { "index_property": "FULL GROUPBY & AGGREGATES pushdown, GROUPBY & AGGREGATES pushdown", "index_statement" (declaração de índice): "CREATE INDEX adv_a_c_b_d ON `shellTest`(`a`,`c`,`b`,`d`)", "keyspace_alias": "shellTest" } ] |
Exemplo 2:
|
1 2 3 4 5 |
CONSELHO SELECIONAR c11 DE shellTest ONDE ID_teste = \"aconselhar\" ORDEM BY c11 DESC LIMITE 2 |
Nessa saída, "c11" pode se qualificar para o pushdown ORDER BY, portanto, "DESC" é adicionado a essa chave de índice.
|
1 2 3 4 5 6 7 |
"covering_indexes": [ { "index_property": "ORDER pushdown, LIMIT pushdown", "index_statement" (declaração de índice): "CREATE INDEX adv_test_id_c11DESC ON `shellTest`(`test_id`,`c11` DESC)", "keyspace_alias": "shellTest" } ] |
Exemplo 3:
|
1 2 3 4 |
CONSELHO SELECIONAR média(c), soma(DISTINTO d) DE shellTest ONDE a = 10 e b < 10 GRUPO BY b |
Neste exemplo, há um agregado DISTINCT em "d".
A agregação DISTINCT só se aplica ao pushdown completo com a expressão agregada DISTINCT nas (n+1) chaves principais.
- "a" vem do predicado de igualdade, ignorado.
- "b" segue como uma expressão GROUP BY.
- As chaves de índice de predicados e GROUP BY se qualificam para pushdowns completos.
- "d" virá depois da expressão GROUP BY "b" e na frente de "c", pois é do agregado DISTINCT.
O resultado da saída:
|
1 2 3 4 5 6 7 |
"covering_indexes": [ { "index_property": "FULL GROUPBY & AGGREGATES pushdown, GROUPBY & AGGREGATES pushdown", "index_statement" (declaração de índice): "CREATE INDEX adv_a_b_d_c ON `shellTest`(`a`,`b`,`d`,`c`)", "keyspace_alias": "shellTest" } ] |
Resumo
O Index Advisor se esforça ao máximo para otimizar os índices recomendados para melhorar o desempenho da consulta. A estrutura de verificação traz o aprimoramento da correção e da robustez, e o suporte para pushdowns de índice melhorará ainda mais o desempenho da consulta.