-
Notifications
You must be signed in to change notification settings - Fork 388
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Otimização de query: findChildrenTree()
e similares
#1169
Comments
Fiz um teste com o Comparação dos resultados dos tempos do
E vale adicionar, que rodei o |
Cara que sensacionaaaal!!!!! Isso vai ser uma das maiores contribuições de performance da Milestone e vai dar para habilitar novamente o autorefresh dos conteúdos das listas 🎉🎉🎉 |
With root_id it will allow to get children without WITH RECURSIVE. fix filipedeschamps#1169
Improve queries performance removing WITH RECURSIVE and using root_id instead. fix filipedeschamps#1169
Turma, andei estudando como otimizar essas consultas, e eliminar as recursivas, e chegue na conclusão de que a solução Basicamente vamos ter uma coluna do tipo Só que com isso podemos buscar qualquer árvore, pois é só filtrar como O que acham? |
Continuando o que foi escrito no #1413 (comment)
Geniaaaaal!!!! Faz total sentido! Minha única preocupação é o quanto isto vai otimizar no tempo de toda a request (considerando a entrada dos índices). Comecei a me perguntar isso depois dos testes lá no repositório do curso, onde montar a árvore de filhos era a parte mais rápida. Então o que acha de também implementarmos um log de trace, marcando o tempo, e que seja possível criar um gráfico no Axiom de cada trecho do código? Eu não sei se o Axiom consegue plotar isso, mas se conseguir, seria muito interessante revelar de forma concreta qual a parte que está precisando de mais otimização 🤝 |
Eu acho uma boa, e tinha pensado justamente nisso pra gente entender o PR 18 do curso.dev 🤝 |
Me parece uma boa solução tbm, e atende a necessidade de filtrar não necessariamente pelo Ainda mais que acredito que o |
Exato! Desde esse commit d0b8d00 não é mais possível alterar o Aproveitando... O
|
Exato! O princípio disso acontece quando um comentário pai foi deletado, e você acessa o filho (aparece como "não disponível"): https://www.tabnews.com.br/filipedeschamps/d23e15c0-419c-4a71-9124-89780a8a8936 Acessando esse conteúdo ali de cima pela API, mas acessando o Isto é feito no filtro de saída: tabnews.com.br/models/authorization.js Lines 233 to 239 in c67630d
Eu topo total então fazer retornar todos os conteúdos, mas filtrar eles na saída 🤝 |
Testei o desempenho com as diversas possibilidades de busca de todos os filhos de um conteúdo e o resumo dos resultados são:
Obs. Pela pequena quantidade de linhas no banco durante meus testes (74), rodei tudo usando Então vou criar o PR usando |
[Edit 2] As primeiras otimizações começaram nos PRs #1400 e #1403... Com a implementação do caminho materializado e a utilização da coluna [Edit] O PR #1431 corrige o bug causado por conteúdo órfão assumindo lugar do conteúdo root |
Contexto
Hoje, se eu não me engano, a query mais pesada do sistema inteiro é esta aqui:
tabnews.com.br/models/content.js
Line 772 in 0bbb0f6
Ela monta a árvore de respostas de um conteúdo e, para isso, de forma recursiva ela vai calculando a relação entre os conteúdos usando o
parent_id
e isto é bastante pesado dependendo da quantidade de interações que uma publicação receber.Além disto, este tipo de recursão é utilizada em outras situações, como por exemplo contar a quantidade de comentários:
tabnews.com.br/models/content.js
Lines 124 to 151 in 0bbb0f6
Há outros lugares dentro deste model que calculamos a quantidade de filhos para colocar em
children_deep_count
.Execução
Com isto, sugiro adicionar um novo campo
root_id
na tabelacontents
que contém e congela oid
do primeiro conteúdo (o conteúdoroot
), onde esteid
é replicado para todos os conteúdoschildren
, para depois colocar um índice e adicionar na recursão a procura por este campo, onde eu especulo que irá acelerar muito o retorno da consulta.E destaco o fato de "congelar" o
id
noroot_id
, pois hoje a nossa árvore de conteúdos é fluída, onde ao alterar oparent_id
de uma publicação existente você pode mover um nó de conteúdo de uma discussão para outra. Altas feature massa que nunca foi usada e acabou sendo uma otimização prematura (e que pode ser solucionada de outra formas melhores).Então devemos remover a possibilidade de alguém conseguir fazer um
PATCH
com essa propriedade, e isto irá quebrar todos os testes que envolvem"parent_id"
, como este:tabnews.com.br/tests/integration/api/v1/contents/[username]/[slug]/patch.test.js
Line 2612 in 0bbb0f6
E para fazer isso, eu iniciaria pelo controller que recebe o
PATCH
. Obody
que é enviado na request passa por essa validação:tabnews.com.br/pages/api/v1/contents/[username]/[slug]/index.public.js
Lines 68 to 75 in 0bbb0f6
Onde neste caso, basta remover por completo a linha
parent_id: 'optional'
que irá fazer o validator remover esta propriedade antes de passar para frente. Então a primeira coisa que eu faria é remover esta linha, rodas os testes e ver o que acontece (e como avançar dali para frente). Por último, eu escreveria um novo teste para provar que enviar umparent_id
não faz nada com o conteúdo.E por hora, o
root_id
não precisa ser retornado na interface pública da API eu especulo, e seria apenas um recurso interno para otimização.Esta alteração envolve anunciar uma Breaking Change na API antes de ser aplicada, mas que não será um problema, pois novamente, eu especulo que ninguém esteja utilizando esta feature.
The text was updated successfully, but these errors were encountered: