Evitando recursão infinita
Conheça a detecção de ciclos, os limites de profundidade e a proteção contra recursão que todo entrevistador verifica.
Evitando recursão infinita é uma aula grátis de SQL Interview Prep no CoddyKit. Esta é a aula 4 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 SQL Interview Prep, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Interview Prep inclui 4 aulas no total.
A pergunta por trás da pergunta
Depois que você escreve uma CTE recursiva, um entrevistador perspicaz pergunta: "O que acontece se os dados tiverem um ciclo?" Isso verifica se você entende que a recursão pode continuar indefinidamente — e se sabe como se proteger contra isso.
Um ciclo ocorre quando a hierarquia retorna sobre si mesma: A se reporta a B, e B se reporta a A. O membro recursivo ingênuo alternará entre os dois indefinidamente.
Como um ciclo se forma
Supõe-se que as árvores não tenham ciclos, mas os dados reais são desorganizados. Uma atualização incorreta pode definir um funcionário como seu próprio gerente, ainda que indiretamente. Um grafo — como "usuários que seguem usuários" — é naturalmente cíclico.
Quando o membro recursivo encontra novamente um nó que já visitou, ele produz esse nó outra vez, o que reativa seus filhos, e o conjunto nunca fica vazio. A recursão só para quando uma etapa não retorna linhas; um ciclo garante que ela sempre retorne linhas.
Proteção 1: um limite de profundidade
A rede de segurança mais simples é um contador de profundidade com um limite no membro recursivo. Mesmo que exista um ciclo, a recursão para ao atingir esse limite.
É uma medida pouco precisa — ela também limita árvores legítimas e profundas —, mas é rápida e adequada para entrevistas.
WITH RECURSIVE org AS (
SELECT id, name, manager_id, 1 AS depth
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, o.depth + 1
FROM employees e JOIN org o ON e.manager_id = o.id
WHERE o.depth < 50
)
SELECT * FROM org;Proteção 2: um caminho visitado
Uma proteção precisa acompanha o caminho dos nós visitados e se recusa a entrar novamente em um nó que já esteja nesse caminho. Acumule os identificadores em uma cadeia de texto ou em uma matriz e verifique a associação antes de continuar a recursão.
Isso interrompe os ciclos com precisão e ainda permite profundidade arbitrária em árvores legítimas.
WITH RECURSIVE org AS (
SELECT id, name, manager_id,
CAST(',' || id || ',' AS VARCHAR(2000)) AS path
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id,
o.path || e.id || ','
FROM employees e JOIN org o ON e.manager_id = o.id
WHERE o.path NOT LIKE '%,' || e.id || ',%'
)
SELECT id, name, path FROM org;Por que a verificação do caminho funciona
A condição path NOT LIKE '%,' || e.id || ',%' significa "siga esta aresta somente se o identificador do filho ainda não estiver no caminho". As vírgulas funcionam como delimitadores, para que o identificador 1 não corresponda incorretamente ao identificador 15.
Se um ciclo fizesse um nó ser visitado novamente, o WHERE filtraria essa linha, o membro recursivo acabaria não retornando nada e a recursão terminaria corretamente.
Proteção 3: cláusula CYCLE nativa
O Postgres moderno (14 ou posterior) e o padrão SQL oferecem uma cláusula CYCLE integrada que automatiza a verificação do caminho e sinaliza os ciclos para você. É a resposta mais limpa quando o mecanismo oferece suporte a ela.
WITH RECURSIVE org AS (
SELECT id, name, manager_id FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employees e JOIN org o ON e.manager_id = o.id
)
CYCLE id SET is_cycle USING cycle_path
SELECT id, name, is_cycle FROM org;MAXRECURSION do SQL Server
O SQL Server impõe por padrão um limite de 100 níveis de recursão. Se um ciclo ou uma árvore profunda o ultrapassar, a consulta gera um erro em vez de continuar indefinidamente — uma válvula de segurança implícita.
Você pode aumentá-lo ou removê-lo usando OPTION (MAXRECURSION n), em que 0 significa ilimitado. Porém, remover o limite sem uma proteção baseada no caminho reintroduz o risco de um ciclo infinito nos dados cíclicos.
-- Cap recursion at 200 levels in SQL Server
SELECT * FROM org
OPTION (MAXRECURSION 200);Detectar versus impedir ciclos
Os entrevistadores podem distinguir dois objetivos:
- Impedir — ignorar silenciosamente a aresta cíclica para que a consulta seja concluída (o
WHEREda verificação do caminho). - Detectar e relatar — mostrar quais linhas fazem parte de um ciclo, para que a equipe de dados possa corrigir os dados incorretos (o sinalizador
is_cycleda cláusulaCYCLE).
Conhecer ambos os objetivos e saber quando cada um é apropriado é uma distinção de nível sênior.
Considerações de desempenho
A recursão pode ser dispendiosa mesmo sem ciclos. Estas são algumas dicas que os entrevistadores gostam de ouvir:
- Crie um índice na coluna da junção, por exemplo
manager_id, para que a junção de cada iteração seja rápida. - Filtre cedo na âncora para iniciar apenas a subárvore necessária, e não a tabela inteira.
- Evite
SELECT *— mantenha apenas as colunas exigidas pela recursão, além dedepthepath.
Um modelo seguro
Combine as proteções em um modelo que você consiga reproduzir sob pressão: a coluna de profundidade como proteção de reserva e a verificação do caminho como proteção precisa. Mesmo que uma delas seja excessiva para dados limpos, mostrar ambas demonstra rigor.
WITH RECURSIVE walk AS (
SELECT id, parent_id, 1 AS depth,
CAST(',' || id || ',' AS VARCHAR(4000)) AS path
FROM nodes WHERE parent_id IS NULL
UNION ALL
SELECT n.id, n.parent_id, w.depth + 1,
w.path || n.id || ','
FROM nodes n JOIN walk w ON n.parent_id = w.id
WHERE w.depth < 100
AND w.path NOT LIKE '%,' || n.id || ',%'
)
SELECT id, depth FROM walk;Armadilhas comuns em entrevistas
Últimas armadilhas a evitar:
- Remover
MAXRECURSIONno SQL Server sem outra proteção — isso reabre o risco de um ciclo infinito. - Declarar uma coluna de texto do caminho curta demais, causando truncamento e deixando a proteção quebrada sem aviso.
- Comparar identificadores sem delimitadores de vírgula, fazendo o identificador 1 corresponder incorretamente dentro do identificador 21.
- Presumir que os dados não têm ciclos apenas porque "deveriam" ser assim — sempre verifique.
Verificação rápida
Escolha a proteção que interrompe os ciclos com precisão sem limitar a profundidade legítima.
Recapitulação
Toda resposta envolvendo uma CTE recursiva deve abordar a segurança:
- Os ciclos fazem o membro recursivo nunca retornar vazio, portanto a recursão nunca para.
- Limite de profundidade = proteção rápida; verificação do caminho visitado = prevenção precisa de ciclos; cláusula CYCLE = detecção nativa em mecanismos modernos.
MAXRECURSION 100do SQL Server é uma válvula implícita — não o remova sem outra proteção.- Crie um índice na coluna da junção e inicie a recursão de forma restrita para obter melhor desempenho.
Agora você consegue escrever, percorrer, gerar e proteger CTEs recursivas de ponta a ponta.
Perguntas Frequentes
A aula “Evitando recursão infinita” é grátis?
Sim — o texto completo de “Evitando recursão infinita” é 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 SQL Interview Prep, atualize para CoddyKit PRO. O curso de SQL Interview Prep inclui 4 aulas no total.
O que vou aprender em “Evitando recursão infinita”?
Conheça a detecção de ciclos, os limites de profundidade e a proteção contra recursão que todo entrevistador verifica. Você pratica SQL 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 SQL Interview Prep?
Nenhuma experiência prévia é necessária. SQL 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 4 de 4.
Quanto tempo leva a aula “Evitando recursão infinita”?
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 SQL Interview Prep?
Sim. Cada aula de SQL 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
- Membros âncora e recursivos
- Percorrendo um organograma
- Gerando séries de números e datas
- Evitando recursão infinita