CTE versus subconsulta versus tabela temporária
Compare as vantagens e desvantagens de materialização, reutilização e comportamento do otimizador.
CTE versus subconsulta versus tabela temporária é uma aula grátis de Coding Interview Prep no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Coding Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Coding Interview Prep inclui 4 aulas no total.
Três formas de organizar a lógica
Quando uma consulta precisa de um resultado intermediário, você tem três ferramentas comuns: uma subconsulta, uma CTE e uma tabela temporária. Entrevistadores pedem que você as compare porque essa escolha indica se você entende a materialização e o comportamento do otimizador.
Esta lição apresenta uma estrutura de decisão que você pode recitar sob pressão.
A subconsulta
Uma subconsulta é uma consulta incorporada dentro de outra, geralmente em FROM, WHERE ou SELECT. Ela faz parte da mesma instrução, e o otimizador a enxerga como uma única unidade.
- Nenhum nome é necessário (mas tabelas derivadas precisam de um nome alternativo).
- O otimizador pode incorporá-la livremente à consulta externa.
- Ela fica extensa e difícil de ler quando é profundamente aninhada.
SELECT *
FROM (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
) t
WHERE t.total > 1000;A CTE
Uma CTE é uma subconsulta nomeada em um bloco WITH, com escopo limitado a uma instrução. Ela é mais legível que uma subconsulta profundamente aninhada e pode ser referenciada várias vezes.
- É nomeada, portanto sua intenção fica documentada.
- Pode ser referenciada mais de uma vez na mesma instrução.
- Continua limitada a uma única instrução e desaparece depois.
WITH spend AS (
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id
)
SELECT *
FROM spend
WHERE total > 1000;A tabela temporária
Uma tabela temporária é uma tabela física real que existe durante a sessão (ou transação). Você a preenche com uma instrução e consulta seus dados em instruções posteriores e separadas.
- Persiste em várias instruções da sessão.
- Pode receber índices e ter estatísticas coletadas.
- Tem o custo de E/S de disco e exige limpeza explícita.
CREATE TEMP TABLE spend AS
SELECT customer_id, SUM(amount) AS total
FROM orders
GROUP BY customer_id;
SELECT * FROM spend WHERE total > 1000;Materialização: a distinção principal
O conceito central que os entrevistadores investigam é a materialização: saber se o resultado intermediário é gravado fisicamente em algum lugar.
- Subconsultas e CTEs geralmente não são materializadas; o otimizador frequentemente as incorpora.
- Uma tabela temporária é sempre materializada no armazenamento.
- Alguns bancos de dados permitem forçar ou impedir a materialização de CTEs por meio de diretivas.
Barreiras de otimização e a antiga armadilha do PostgreSQL
Historicamente, o PostgreSQL tratava cada CTE como uma barreira de otimização, materializando-a e impedindo a aplicação antecipada de predicados. Desde o PostgreSQL 12, CTEs simples e não recursivas referenciadas uma única vez são incorporadas por padrão, com as diretivas MATERIALIZED e NOT MATERIALIZED para substituir esse comportamento.
Mencionar essa nuance é um forte sinal de experiência sênior.
WITH spend AS NOT MATERIALIZED (
SELECT customer_id, SUM(amount) AS total
FROM orders GROUP BY customer_id
)
SELECT * FROM spend WHERE total > 1000;Reutilização dentro de uma instrução
Se você referencia o mesmo resultado intermediário várias vezes em uma instrução, uma CTE pode ser mais clara do que repetir uma subconsulta. Mas tenha cuidado: uma CTE incorporada pode ser recalculada a cada referência.
Quando o recálculo é caro, forçar a materialização (ou usar uma tabela temporária) evita fazer o trabalho duas vezes.
Reutilização entre instruções
CTEs e subconsultas existem somente durante uma instrução. Se você precisa do mesmo resultado em várias consultas separadas, a tabela temporária é a ferramenta adequada.
Um caso típico é um processo de ETL ou relatório em várias etapas, no qual você cria um conjunto de preparação uma vez e depois executa várias análises sobre ele. Criar índices na tabela temporária pode então acelerar todas as consultas posteriores.
Índices e estatísticas
Somente uma tabela temporária pode conter índices e estatísticas atualizadas. Para um conjunto intermediário enorme, unido muitas vezes, isso pode ser decisivo.
- CTE/subconsulta: estimativas do otimizador com base nas tabelas subjacentes.
- Tabela temporária: você pode executar
ANALYZEnela e adicionar índices ajustados às suas junções posteriores.
Assim, para resultados grandes e muito reutilizados, uma tabela temporária pode vencer em desempenho, apesar das etapas adicionais.
A estrutura de decisão
Uma resposta objetiva para a entrevista:
- Subconsulta: uso pontual, pouco aninhamento e legibilidade adequada.
- CTE: melhora a legibilidade ou é referenciada algumas vezes em uma única instrução.
- Tabela temporária: reutilizada entre instruções, muito grande ou necessária quando você precisa de índices/estatísticas.
Prefira uma CTE por padrão, pela clareza; escolha uma tabela temporária quando a materialização ou a reutilização entre instruções realmente ajudar.
Como apresentar o compromisso
Evite afirmações absolutas como “CTEs são sempre mais lentas”. Diga, em vez disso: CTEs e subconsultas geralmente são incorporadas, portanto dizem respeito à legibilidade; uma tabela temporária é materializada e vale a pena quando eu reutilizo um resultado grande entre instruções ou preciso de um índice.
Reconhecer que esse comportamento é específico do mecanismo (e específico da versão no PostgreSQL) demonstra conhecimento real.
Verificação rápida
Escolha o cenário em que uma tabela temporária é claramente a melhor opção.
Recapitulação: CTE vs. subconsulta vs. tabela temporária
A escolha depende da materialização e do escopo.
- Subconsultas e CTEs: geralmente incorporadas, limitadas a uma instrução e escolhidas pela legibilidade.
- CTEs acrescentam nomes e reutilização dentro da instrução.
- Tabelas temporárias: sempre materializadas, persistem entre instruções e podem receber índices.
- O PostgreSQL 12+ incorpora CTEs simples; use as diretivas MATERIALIZED para controlar esse comportamento.
Em seguida: refatoração de uma consulta aninhada e confusa em CTEs organizadas.
Perguntas Frequentes
A aula “CTE versus subconsulta versus tabela temporária” é grátis?
Sim — o texto completo de “CTE versus subconsulta versus tabela temporária” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Coding Interview Prep, atualize para CoddyKit PRO. O curso de Coding Interview Prep inclui 4 aulas no total.
O que vou aprender em “CTE versus subconsulta versus tabela temporária”?
Compare as vantagens e desvantagens de materialização, reutilização e comportamento do otimizador. Você pratica Coding Interview Prep com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Coding Interview Prep?
Nenhuma experiência prévia é necessária. Coding Interview Prep no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “CTE versus subconsulta versus tabela temporária”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Coding Interview Prep?
Sim. Cada aula de Coding Interview Prep inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Escrevendo sua primeira CTE
- Encadeando várias CTEs
- CTE versus subconsulta versus tabela temporária
- Refatorando consultas aninhadas em CTEs