mais lidos
Life at Nu
Conheça a sede do Nubank em Pinheiros, São Paulo/Brasil jan 11
Design
A nova aparência do Nubank: conheça nossa nova logo maio 17
Culture & Values
Como os valores e a cultura da Nu moldam os produtos que criamos ago 7
Carreiras
Reunimos grandes mentes de diversas origens que permitem a discussão e o debate e melhoram a resolução de problemas.
Saiba mais sobre nossas carreiras



Escrito por: Keith Harper
Revisado por: Robert Randolph, Jarrod Taylor
Como escritor de uma consulta Datomic, você tem o controle sobre a ordem de cláusulas de consulta, o que pode ser muito eficiente se você tiver informações suficientes para ordenar cláusulas de consulta com prioridade da maior para a menor. Algumas medidas de seletividade de cláusulas são a quantidade de linhas fluindo para dentro e fora de cada cláusula, assim como a finitude de variáveis lógicas usadas por cada cláusula. As informações retornadas pelas estatísticas de consulta podem apresentar essas medidas e serem usadas para tomar uma decisão informada sobre a ordenação de cláusulas.
Usaremos o repositório do banco de dados de exemplo do MusicBrainz para todos os exemplos neste artigo. Para um breve tutorial sobre como executar o Datomic localmente com o banco de dados de exemplo do MusicBrainz, clique em LEIA-ME.
Usaremos estatísticas de consulta para obter o estado “depois”, representado na imagem acima, definindo o conjunto de resultados intermediário como o menor possível entre as cláusulas.
Como solicitar estatísticas de consulta
Começando na versão v1.0.6610 do Datomic On-Prem,que será lançada em breve para o Datomic Cloud, os usuários agora podem solicitar estatísticas de consulta enquanto fazem uma consulta.
Para executar uma consulta enquanto se acumula estatísticas de consulta, precisaremos usar datomic.api/query e fornecer “:query-stats true” no argumento de mapa de consulta.
Algumas partes das estatísticas de consulta serão explicadas com mais detalhes nas próximas seções. Para mais informações, consulte a documentação de usuário para estatísticas de consulta.
Conheça nossas oportunidades
Cenário: usar estatísticas de consulta durante a otimização de ordem de cláusulas
Neste cenário, vamos trabalhar com estatísticas de consulta para guiar nosso processo de avaliação enquanto buscamos uma ordenação ideal de cláusulas.
Vamos fazer uma consulta que encontrará álbuns lançados antes de 1970, nos quais pelo menos um dos artistas seja o John Lennon, e depois revelar o nome do álbum e o ano de lançamento.
Os resultados da solicitação de estatísticas de consulta para esta consulta podem ser vistos aqui.
:phases
Cada item abaixo de “.phases” representa um conjunto de cláusulas que serão processadas como uma única unidade de trabalho. Costuma existir apenas um único item para a maioria das consultas, mas algumas delas terão vários itens sob “:phases” (por exemplo: os que usam regras de consulta)
:sched
“:sched” é a abreviação de “schedule” (cronograma, em inglês), e representa o plano aproximado que a ferramenta de consulta usará ao processar esta consulta:
Perceba que há uma cláusula de consulta extra no cronograma que não estava no conjunto de cláusulas que fornecemos para “.where”. “[(ground $__in__2) ?artist-name]” é como o valor (John Lennon) e a variável lógica (“?artist-name”) passados para “:in” se vinculam à ferramenta de consulta.
:clauses
“:clauses” contém as cláusulas de consulta feitas para esta fase:
A tabela acima pode facilitar a interpretação das estatísticas de consulta para cláusulas. Perceba como “:rows-in” e “:binds-in” para uma cláusula correspondem diretamente a “:rows-out” e “:binds-out” da cláusula anterior.
Cláusula 1
Ressaltando, essa cláusula representa apenas o vínculo do valor e da variável lógica passados para “.in”.
“:rows-in 0” indica que não havia linhas no resultado definido antes do processamento da cláusula.
“:rows-out 1” indica que o resultado definido agora tem 1 cláusula presente, que contém o vínculo indicado por “:binds-out [?artist-name]”.
“:expansion 1” significa apenas que “:rows-out” aumentou de tamanho em 1 linha, após o processamento dessa cláusula.
Cláusula 2
Perceba que “:binds-out” não tem mais “?artist-name”, mas tem um novo vínculo de “?artist”. Isso acontece porque a ferramenta de consulta pode ver as cláusulas que serão processadas depois dessa, e nenhuma delas usa “?artist-name”. Assim, ela pode ser removida dos resultados sem problemas.
Cláusula 3
Agora chegamos à primeira cláusula que apresenta uma expansão real do conjunto de resultados. As estatísticas de consulta para esta cláusula indicam que foram encontrados 21 lançamentos, entre os quais John Lennon estava envolvido.
Cláusula 4
Esta cláusula introduz novos valores ao conjunto de resultados, como indicado pela diferença entre os vínculos de entrada e de saída. Apesar disso, a quantidade de linhas no conjunto de resultados não aumenta. O que você acha que aconteceria se transformássemos essa última cláusula em nossas cláusulas “.where”?
Cláusula 5
A última cláusula limita bastante o conjunto de resultados e mostra informações que ainda não estavam presentes: “:preds”. A presença de uma entrada “:preds” indica que as cláusulas correspondentes foram usadas como predicados de filtro enquanto buscavam respostas para “[?release :release/year ?year]”.
Agora vamos conferir o que aconteceria se movêssemos a cláusula 4 até o fim das nossas cláusulas “:where”.
Cenário: Executar todas as uniões necessárias, depois projetar os valores
Vamos usar a mesma consulta de antes, mas desta vez observaremos o que acontece quando movemos “[?release :release/name ?album-name]” para o fim das nossas cláusulas “:where”.
Acontece algo muito interessante quando executamos essa busca, embora não fique óbvio imediatamente. Os resultados da solicitação de estatísticas de consulta para esta consulta podem ser vistos aqui.
Vamos rever a cláusula 4 da primeira consulta:
Podemos observar que o conjunto de resultados agora contém 21 itens, cada um com 2 valores. Como resultado, temos um total de 42 valores no conjunto de resultados.
Agora vamos comparar isso com a segunda consulta:
A cláusula 4 na segunda consulta reduz nosso conjunto de resultados de 21 para 3, mas acrescenta outro valor nele. O conjunto de resultados atual contém 3 linhas, com 2 valores em cada uma, totalizando 6 valores.
Agora, a cláusula que encontra o nome do álbum só precisa buscar em 3 álbuns. Antes, era preciso buscar em 21 e excluir todos, exceto 3, após limitar o ano de lançamento. Como você pode imaginar, isso economiza bastante trabalho em escalas maiores.
Conclusão
Essa é apenas uma das possibilidades de usar informações retornadas por estatísticas de consulta para entender e aprimorar suas consultas. As estatísticas de consulta também podem ser úteis para quando você se perguntar por que suas consultas agem diferente conforme uma distribuição diferente dos dados subjacentes, ou questionar regras recursivas de consultas etc.
Conheça nossas oportunidades