O Couchbase 4.5 foi lançado!! Parte 2 é uma continuação deste blog e inclui a cobertura de índices de matriz, suporte para mais operadores, como UNNEST, ALL, ANY AND EVERY etc,

Você tem documentos com matrizes incorporadas e precisa de um meio eficiente de acessar os dados armazenados nessas matrizes? As matrizes são um dos recursos avançados da modelagem de dados NoSQL/JSON. As matrizes podem armazenar dados com vários valores dentro de um atributo de documento, como vários números de telefone, informações sobre crianças, horários de voos, análises de produtos, comentários e respostas de blogs etc. Isso não apenas mantém todos os dados relevantes juntos no mesmo documento, mas também melhora o desempenho da consulta, evitando JOINs desnecessários. As matrizes em documentos não são novidade para o Couchbase ou o N1QL (SQL para JSON), que já tem uma ampla seleção de construções e operadores para armazenar, indexar e processar matrizes.

O Couchbase 4.5 Developer Preview adiciona suporte para Indexação de matrizes com a capacidade de indexar e consultar elementos individuais da matriz ou quaisquer objetos/atributos aninhados na matriz. A indexação de matriz melhora muito o desempenho das consultas que envolvem matrizes, especialmente o acesso a valores e atributos dentro da matriz. Ela também simplifica o processamento de atributos de matriz no Consultas N1QL. Isso representa um grande salto em relação às versões anteriores, em que os índices secundários podiam ser criados e, posteriormente, consultados, mas somente no conteúdo de toda a matriz.  

Vamos ver como a mágica funciona. Considere o 'amostra de viagem' balde enviado com o produto, e o cronograma nos documentos com tipo = rota

Em versões anteriores, quando um índice é criado em cronograma a matriz inteira é indexada com todo o seu conteúdo/elementos como um único valor escalar. Isso significa que tudo o que você vê na caixa azul no exemplo acima é considerado como um único valor de índice. Portanto, mais tarde, quando você consultar o cronogramao valor total do array precisa ser fornecido no Cláusula WHERE para usar o índice. Isso pode ser gerenciável para matrizes simples/pequenas, mas, em geral, apresenta os seguintes problemas:

  1. Indexação de dados de granulação fina dentro da matriz: E se você quiser indexar apenas um subconjunto da matriz, digamos voo dentro do atributo cronograma ou apenas para determinados dias?

  2. Tamanho e desempenho do índice: Quando toda a matriz é indexada, ela consome mais espaço de armazenamento do índice e leva mais tempo para pesquisar o índice. A Figura 1 mostra o índice criado para o atributo cronograma com a versão anterior à 4.5.

  1. Pesquisa em matrizes: Ao indexar toda a matriz, não podemos pesquisar com eficiência dados específicos dentro da matriz. O aplicativo teria que primeiro buscar/SELECIONAR o valor total da matriz e depois processá-lo para encontrar os dados de interesse.

  2. Matrizes de tamanho grande: Não é conveniente (e às vezes impossível) fornecer o valor total do array em uma cláusula WHERE quando o array tem muitos elementos.

A indexação de arrays no Couchbase 4.5 aborda todos esses problemas e tem aprimoramentos no N1QL e no indexador para aproveitar os arrays indexados. Isso inclui suporte para índices parciais, arrays aninhados, índices compostos e operadores como  ANY, IN, WITHIN, DISTINCT ARRAY. Vamos dar uma olhada em alguns exemplos:

  1. Primeiro, crie um índice de matriz no cronograma usando o atributo ARRAY DISTINTO que especifica os elementos exatos do array ou os atributos aninhados a serem usados como chaves de índice. A instrução a seguir indexa "todos os voos programados em dias úteis (ou seja dia <= 5)”. Observe que conseguimos criar um índice em apenas um subconjunto dos elementos da matriz que são de interesse. Portanto, o novo índice de matriz é compacto e eficiente (veja a Figura 2) e armazena apenas as informações necessárias no índice.

  1. Agora, o índice pode ser usado em uma instrução SELECT ou em qualquer outra instrução DML, especificando as chaves e os predicados do índice na cláusula WHERE. Na versão atual, é necessário especificar os nomes exatos das variáveis, chaves de índice (como v, v.day, v.flight), e predicados tais como (type = "route") e (v.day = 4) que correspondem aos especificados na definição de CREATE INDEX. Esse critério de seleção de índice é necessário para que o N1QL escolha automaticamente o índice correspondente para processar uma consulta. Como de costume, quando são criados vários índices correspondentes, A cláusula USE INDEX pode ser usada para sugerir que o N1QL use um índice específico.

Por exemplo, a consulta a seguir encontra o "número de voos da UA programados em 4th dia" usando o índice da matriz. A consulta usa o iscada porque ele segue os requisitos de seleção de índices:

  1. A variável v é usada, que é a variável exata usada na definição do índice.

  2. A chave de índice v.voo é usado na cláusula WHERE.

  3. Ambos os predicados de índice (type = "route") e (v.day = 4) são usados na cláusula WHERE. Observe que (v.day = 4)é considerado correspondente, porque é "incluído" por (v.day <= 5)que é especificado na definição de CREATE INDEX.

  1. Desempenho: Os índices de matriz aumentam consideravelmente o desempenho das consultas que podem aproveitar o índice. Por exemplo, a consulta acima em (2), que usa o índice de matriz "iscada levou cerca de 256 ms em meu laptop. No entanto, a consulta a seguir usando o índice 'def_type' levou quase 2,38 segundos. Isso representa um desempenho 9 vezes melhor com índices de matriz.

Você pode saber mais sobre indexação de array e ver mais exemplos, como índices de array composto e aninhado, na seção Couchbase 4.5 documentaçãoe confira o demonstração.

Experimente e me informe se tiver alguma dúvida/comentário ou se ele é incrível ;-)

Saúde!!!

Autor

Postado por Prasad Varakur, gerente principal de produtos da Couchbase

Prasad Varakur é gerente de produto principal da Couchbase. Prasad é líder de produtos e engenharia em bancos de dados (SQL, noSQL, Bigdata) e sistemas distribuídos.

Deixar uma resposta