0Pricing
Coding Interview Prep · Aula

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 ANALYZE nela 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

  1. Escrevendo sua primeira CTE
  2. Encadeando várias CTEs
  3. CTE versus subconsulta versus tabela temporária
  4. Refatorando consultas aninhadas em CTEs
← Voltar para Coding Interview Prep