Com o servidor Couchbase 4,0 GA - apresentamos a você o N1QL, que foi um facilitador essencial para desenvolver com agilidade e operar em escala! Agora, temos o prazer de anunciar o versão prévia para desenvolvedores do 4.1 - que tem correções de estabilidade valiosas. Dentro disso, há um recurso importante chamado Covering Indexes.

O Covering Index é um novo e empolgante recurso do N1QL na versão 4.1 que permite que um aplicativo, que o aproveite adequadamente, reconheça uma melhoria notável no desempenho da consulta em muitos casos. Uma consulta coberta é uma consulta N1QL na qual todos os campos da consulta fazem parte de um índice, e todos os campos retornados na consulta estão no mesmo índice.

Antes desse aprimoramento, se você der uma olhada no fluxo de execução da consulta, ele é o seguinte:

  1. O cliente do aplicativo emite uma solicitação de consulta ao servidor por meio de uma API Rest

  2. O serviço de consulta passa por uma fase de análise e análise e gera um plano de consulta.

  3. O serviço de consulta emite solicitações de varredura para o serviço de índice se houver um índice válido para a situação

  4. Obtém de volta as chaves de documento qualificadas do serviço Index

  5. Envia as chaves do documento para o Data Service (uma "solicitação de busca")

  6. Obtém os documentos de volta do Data Service

  7. Avalia os documentos (reaplica os critérios de filtragem etc.)

  8. Envia os resultados finais filtrados de volta ao cliente

Em um aplicativo bem projetado, as etapas 5 e 6 podem ser evitadas usando um índice de cobertura (que recomendamos como prática recomendada), o que pode resultar em uma melhoria de desempenho demonstrável.

A instrução EXPLAIN no N1QL permite que você veja o plano de execução da consulta. Quando um índice de cobertura é usado para a execução da consulta, o EXPLAIN agora mostrará que um índice de cobertura é usado para acesso aos dados (e as buscas de documentos de valor-chave e a sobrecarga associada são evitadas).

Digamos que criemos um índice sobre o atributo "state" (estado) no bucket de amostras de cerveja.

CREATE INDEX idxstate ON amostra de cerveja(estado) USANDO GSI

Agora, se selecionarmos o estado de beer-sample, como todos os dados a serem retornados estão presentes no índice, poderemos evitar a busca de dados de valor-chave e apenas retornar os dados com base no índice.

EXPLAIN SELECT state FROM beer-sample' WHERE state = "CA"

"results": [

      {

          "#operator": "Sequence",

          "~children": [

              {

                  "#operator": "IndexScan",

                  "covers": [

                      "cover((amostra de cerveja.estado))"

                  ],

                  "index": "idxstate",

                  "Espaço-chave": "beer-sample",

                  "namespace": "default",

                  "spans": [

                      {

                          "Range": {

                              "Alto": [

                                  ""CA""

                              ],

                              "Inclusão": 3,

                              "Low": [

                                  ""CA""

                              ]

                          }

                      }

                  ],

                  "using": "gsi"

Observação: O mesmo índice NÃO é um índice de cobertura se a consulta for ligeiramente modificada.

EXPLAIN SELECT estado, cidade FROM amostra de cerveja ONDE STATE = "CA";

Ele ainda usa o índice idxstate, porém, como o índice NÃO contém as informações da cidade, ele usa o índice para uma pesquisa mais rápida, mas não como um índice de cobertura.

{

    "requestID": "c60b10d2-2cab-4b6a-987c-e5e6ebe4a900",

    "signature" (assinatura): "json",

    "results": [

       {

           "#operator": "Sequence",

           "~children": [

               {

                   "#operator": "IndexScan",

                   "index": "idxstate",

                   "Espaço-chave": "beer-sample",

                   "namespace": "default",

                   "spans": [

                       {

                           "Range": {

                               "Alto": [

                                   ""CA""

                               ],

                               "Inclusão": 3,

                               "Low": [

                                   ""CA""

                               ]

                           }

                       }

                   ],

                   "using": "gsi"

               },

               {

                   "#operator": "Paralelo",

                   "~child": {

                       "#operator": "Sequence",

                       "~children": [

                           {

                               "#operator": "Fetch",

                               "Espaço-chave": "beer-sample",

                               "namespace": "default"

                           },

                           {

                               "#operator": "Filter",

                               "condition": "((amostra de cerveja.estado) = "CA")"

                           },

                           {

                               "#operator": "InitialProject",

                               "result_terms": [

                                   {

                                       "expr": "(amostra de cerveja.estado)"

                                   },

                                   {

                                       "expr": "(amostra de cerveja.cidade)"

                                   }

                               ]

                           },

                           {

                               "#operator": "FinalProject"

                           }

                       ]...resto omitido para fins de brevidade

Como podemos então converter essa consulta modificada para usar um índice de cobertura?
Aqui está,

CREATE INDEX idxstatecity ON amostra de cerveja (estado, cidade) USANDO GSI

Agora, se executarmos a consulta:

EXPLAIN SELECT estado, cidade

DE amostra de cerveja USE INDEX (idxstatecity)

WHERE STATE = "CA" ;

Bingo! Ela se torna uma consulta que usa um índice de cobertura

    

               {

                   "#operator": "IndexScan",

                   "covers": [

                       "cover((meta(amostra de cerveja).id))",

                       "cover((amostra de cerveja.estado))",

                       "cover((amostra de cerveja.cidade))"

                   ],

                   "index": "idxstatecity",

                   "Espaço-chave": "beer-sample",

                   "namespace": "default",

                   "spans": [

                       {

                           "Range": {

                               "Alto": [

                                   "successor("CA")"

                               ],

                               "Inclusão": 1,

                               "Low": [

                                   ""CA""

                               ]

                           }

                       }

                   ],

                   "using": "gsi"

               },

  

EXPRESSÕES E AGREGADOS

As consultas com expressões e agregados também podem se beneficiar do índice de cobertura.

CREATE INDEX idxstatecountry ON amostra de cerveja(estado, país) USANDO GSI

SELECT country, max(state)

DE amostra de cerveja USE INDEX (idxstatecountry)

WHERE STATE LIKE '%'

GROUP BY country

UNIÃO / INTERSEÇÃO / EXCEÇÃO

Também há suporte para esses índices de cobertura

SELECIONAR PAÍS

DE amostra de cerveja

WHERE STATE = 'CA'

UNION ALL

SELECIONAR PAÍS

DE amostra de cerveja

WHERE STATE = 'Texas'

E como o índice já está classificado, quando você usa ORDER BY no caso de um índice de cobertura, há o benefício adicional de o mecanismo de consulta já poder usar um índice classificado.

Consulte nosso documentação para obter mais informações e outros cenários em que os índices de cobertura serão úteis para você.

Recomendamos enfaticamente que você experimente esse recurso na visualização para desenvolvedores da versão 4.1 e nos dê seu valioso feedback. feedback.

Você também pode experimentar o N1QL usando o Developer Preview do Workbench de consultaque fornece uma boa GUI para escrever e executar consultas N1QL.

Autor

Postado por Ilam Siva, SR. Gerente de produtos, Couchbase

Ex-gerente sênior de produtos da Couchbase, Ilam Siva é responsável por várias áreas de desenvolvimento de produtos, roteiro, posicionamento, mensagens e garantias do Couchbase Server. Ilam é apaixonado por Big Data e NoSQL e acredita que eles ampliarão as fronteiras da escala, do desempenho e dos recursos dos aplicativos da próxima geração. Antes da Couchbase, ele trabalhou com Hadoop, plataforma de nuvem e tecnologias de banco de dados no Yahoo!, Microsoft e Oracle.

Deixar uma resposta