Coautor: Till Westmann, Diretor Sênior de Engenharia
O bits para o Couchbase 6.5, a próxima versão do Couchbase Server, já estão disponíveis. O serviço Analytics, que oferece suporte ao processamento eficiente de consultas paralelas, adicionou suporte às funções de janela definidas no padrão sql:2003.
Para muitos de nós (inclusive para mim), as funções de janela são esse recurso mágico que raramente usamos. Mas as funções de janela tornam as consultas SQL mais concisas, melhorando a legibilidade, o que facilita a manutenção de consultas para aplicativos do mundo real. As consultas expressas pelas funções de janela envolveriam, de outra forma, uniões e subconsultas dispendiosas que são difíceis de otimizar, resultando em consultas de execução lenta. Vou ilustrar esse ponto calculando um total em execução, que é o exemplo mais prático para o uso de funções de janela. Nesta postagem do blog, calcularei o total em execução de duas maneiras: a maneira antiga, usando um INNER JOIN, e as novas Window Functions disponíveis no Couchbase 6.5.
O que é um total acumulado?
A Total em execução é um total que é continuamente ajustado para levar em conta os itens à medida que são adicionados. Outro termo para isso é soma parcial. No exemplo abaixo, o total em execução para uma data de transação seria o total em execução do InvoiceID mais o TransactionAmount atual.
Embora eu tenha calculado o RunningTotal acima, observe que os três primeiros campos são os dados de origem e que o RunningTotal precisa ser calculado usando uma consulta SQL.
Pré-requisitos
Baixar Servidor Couchbase 6.5 e configurar um bucket do Couchbase para os dados de amostra para executar as consultas nesta postagem do blog.
Crie um bucket do Couchbase chamado "invoices" com os dados abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[ { "invoices" (faturas): { "InvoiceID" (ID da fatura): 1, "TransactionDate" (data da transação): "2019-08-11", "TransactionAmount": 100 } }, { "invoices" (faturas): { "InvoiceID" (ID da fatura): 2, "TransactionDate" (data da transação): "2019-08-11", "TransactionAmount": 200 } }, ... ... { "invoices" (faturas): { "InvoiceID" (ID da fatura): 3, "TransactionDate" (data da transação): "2019-08-11", "TransactionAmount": 800 } } ] |
No workbench do Analytics, execute a seguinte instrução para criar o conjunto de dados
1 2 |
CRIAR CONJUNTO DE DADOS faturas em faturas; CONECTAR LINK Local; |
Consulta Inner Join para total de execução em um determinado dia
Para cada InvoiceID, precisamos recuperar o valor da transação e todos os valores de transações anteriores a ela. Isso é feito usando um Inner Join com uma condição para obter cada fatura e as anteriores a ela.
1 2 3 4 5 |
SELECIONAR inv1.ID da fatura , inv1.Data da transação, inv1.TransactionAmount, SUM(inv2.TransactionAmount) AS RunningTotal DE faturas inv1 JUNTAR faturas inv2 ON inv1.ID da fatura >= inv2.ID da fatura ONDE inv1.Data da transação = "2019-08-11" GRUPO BY inv1.ID da fatura, inv1.Data da transação, inv1.TransactionAmount ORDEM BY inv1.ID da fatura |
JOINs e NoSQL nem sempre se deram bem juntos. De fato, a sabedoria convencional é que os dados no mundo NoSQL são desnormalizados para evitar JOINs. Mas o Couchbase Analytics foi criado para exploração de dados e análise ad-hoc que inclui junções e agregações complexas. O mecanismo de consulta do Analytics pode processar JOINs que não são suportados por outros fornecedores de NoSQL -
- Cassandra - sem suporte a JOIN em CQL
- MongoDB - não é possível unir coleções fragmentadas
Caso você esteja se perguntando como o Couchbase Analytics pode unir dados JSON, recomendo que você se aprofunde neste apresentação de vídeo com o professor Mike Carey, Arquiteto-chefe de consultoria para Couchbase.
Consulta de função de janela para total de execução em um determinado dia
Se você não estiver familiarizado com as funções de janela, recomendo a leitura de Documentação do PostgresSQL que oferece uma ótima introdução:
"A função de janela executa um cálculo em um conjunto de linhas da tabela que estão de alguma forma relacionadas à linha atual. Isso é comparável ao tipo de cálculo que pode ser feito com uma função de agregação. Mas, diferentemente das funções agregadas comuns, o uso de uma função de janela não faz com que as linhas sejam agrupadas em uma única linha de saída - as linhas mantêm suas identidades separadas. Nos bastidores, a função de janela é capaz de acessar mais do que apenas a linha atual do resultado da consulta."
Esta é a aparência da consulta real
1 2 3 4 |
SELECIONAR ID da fatura, Data da transação, TransactionAmount, SUM(TransactionAmount) SOBRE (ORDEM BY ID da fatura) como RunningTotal DE faturas ONDE Data da transação = "2019-08-11" ORDEM BY ID da fatura |
Além da simplicidade e da concisão, há algumas coisas interessantes sobre a declaração acima -
- Há uma função de agregação, mas não há cláusula group by. Normalmente, as funções de agregação exigem uma cláusula group by, mas como estamos usando a cláusula OVER, SUM é considerada uma função de janela.
- A cláusula OVER recupera um conjunto específico de linhas, em relação à linha atual, e executa uma operação em um campo específico.
- ORDER BY define a ordem lógica em que a função de janela é avaliada.
Observação: O Couchbase oferece suporte a funções de janela para os serviços de consulta e análise, e a mesma consulta pode ser executada nos workbenches de consulta e análise. Para executar no serviço de consulta, os seguintes índices precisam ser criados
1 2 |
CRIAR PRIMÁRIO ÍNDICE ON faturas; CRIAR ÍNDICE invoices_id ON faturas(ID da fatura); |
O objetivo desta postagem do blog foi apresentar as funções de janela no Couchbase Analytics. As funções de janela NÃO são novas no SQL, elas fazem parte do padrão SQL e estão disponíveis em todos os principais bancos de dados relacionais e ferramentas de Big Data, como Hive e Spark. Com a versão 6.5, o Couchbase está trazendo essas funções para os bancos de dados de documentos. Se você quiser experimentar isso em primeira mão, por favor Faça o download dos bits e interaja conosco em fóruns.