Expressões Comuns de Tabela (CTEs)
CTEs melhoram a legibilidade, mas introduzem armadilhas de planejamento e recursão. Audite consultas com muitas CTEs antes da produção.
Como Usar Esta Lista
- Revise durante o PR de SQL para materialização oculta ou profundidade de recursão.
- Use
EXPLAIN ANALYZEapós adicionar cadeias de CTEs. - Prefira legibilidade; refatore quando provado ser lento.
Comportamento do Planejador (1-3)
-
Suposição de que a CTE é sempre inline - O PostgreSQL pode materializar nós
WITH(especialmente com recursão ou certas referências).- Por que acontece: O planejador escolhe com base no custo; verifique com
EXPLAIN. - Correção: indefinido.
- Por que acontece: O planejador escolhe com base no custo; verifique com
-
Referências duplicadas de CTE - A mesma CTE referenciada duas vezes pode ser executada duas vezes se não for materializada.
- Por que acontece: Materialize com
AS MATERIALIZEDno PG 12+ quando necessário. - Correção: indefinido.
- Por que acontece: Materialize com
-
Filtragem após CTE enorme - Grande conjunto intermediário e depois
WHEREna consulta externa.- Por que acontece: Empurre filtros para a etapa de CTE mais inicial possível.
- Correção: indefinido.
Armadilhas de Legibilidade (4-5)
-
Cadeias de CTEs muito profundas -
WITHde dez etapas é difícil de testar.- Por que acontece: Divida em views ou tabelas temporárias em estágios para ETL.
- Correção: indefinido.
-
CTE recursiva sem guarda de ciclo - Recursão infinita até
work_memesgotar.- Por que acontece: Rastreie nós visitados; defina a profundidade máxima de recursão.
- Correção: indefinido.
FAQs
Quando usar MATERIALIZED?
Quando você precisa de uma única avaliação de uma CTE cara referenciada várias vezes.
Relacionados
- Noções Básicas de SQL Avançado - Introdução a CTEs
- CTEs Recursivas - Hierarquias
Versões do Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.