ActiveRecord: fundamentos de CTE
O curso trata das Common Table Expressions não recursivas no Postgres e de como o ActiveRecord as monta. Começa pelo SQL que uma cláusula WITH gera e segue para ActiveRecord::Relation#with, com o aviso de injeção da documentação sobre strings cruas em Arel.sql. Mostra que definir uma CTE não tem efeito até que .from ou .joins a referencie pelo nome. As aulas seguintes fazem join com uma CTE de matrículas agrupadas, montam uma CTE a partir de outra e usam EXPLAIN para testar a ideia de barreira de otimização no PostgreSQL 12 em diante.
O que você vai aprender
- ✓Como o WITH dá nome a uma subquery durante uma instrução
- ✓Montar CTEs com ActiveRecord::Relation#with e o risco de injeção do Arel.sql
- ✓Ligar uma CTE à query com .from ou .joins
- ✓Fazer join com uma CTE montada a partir de dados agrupados
- ✓Encadear CTEs e a regra de ordem que o Postgres impõe
- ✓Ler planos do EXPLAIN para CTEs inline e com MATERIALIZED
WITH: dando um nome pra uma subquery que dá pra reaproveitar
SQL: agregações usou GROUP BY com HAVING para ficar só com os grupos acima de um limite, como os cursos com mais de uma matrícula. Escrito como subquery, esse resultado é calculado uma vez e jogado fora assim que a query de fora termina. O Postgres consegue calcular a mesma subquery e dar um nome a…
Ler a aula completa grátis →Currículo
7 aulasWITH: dando um nome pra uma subquery que dá pra reaproveitar
Como o WITH dá a uma subquery um nome que existe durante uma instrução e pode ser reaproveitado.
ActiveRecord::Relation#with: o método do Rails para montar uma CTE
Como ActiveRecord::Relation#with monta uma cláusula WITH a partir de um hash de nomes e relations, com seu aviso de injeção.
A armadilha: definir uma CTE com .with não significa que algo a referencia
Por que uma CTE definida com .with não tem efeito até que .from ou .joins a referencie pelo nome.
Fazendo join com uma CTE: dados agrupados de matrícula das tabelas deste app
Fazer join dos cursos com uma CTE de matrículas agrupadas usando uma string de SQL cru no .joins.
Uma CTE montada a partir de outra
Montar uma CTE a partir de uma anterior com .from, e por que o Postgres impõe a ordem entre elas.
O mito da barreira de otimização: verdadeiro antes do Postgres 12, falso por padrão agora
Usar EXPLAIN para mostrar que o PostgreSQL 12 em diante faz inline de CTEs com uma referência, e o que MATERIALIZED muda.
Juntando tudo: um nome, definido uma vez, lido onde é usado
Uma revisão do modelo: um nome definido uma vez, ligado com .from ou .joins e lido onde é usado.