Filtrar por texto pode destruir a performance do SQL

Se você já trabalhou com views grandes, dashboards BI ou análises em bases volumosas, provavelmente já sofreu com consultas lentas, timeouts ou relatórios demorando minutos (ou horas) para carregar.
Uma vez, durante uma análise real, me deparei exatamente com isso, um simples filtrar por texto no SQL — e a solução foi mais simples do que parecia.

Às vezes, trocar o campo certo no filtro faz toda a diferença.


🔍 O cenário real

Recebi um script que utilizava uma view grande como fonte principal para um dashboard BI. Essa view processava entre 1 e 10 milhões de registros, com vários SELECTs internos, campos derivados e múltiplas referências à mesma tabela.

O filtro aplicado originalmente era assim:

WHERE status_processo= 'pendentes'

O problema: essa consulta demorava e frequentemente resultava em timeout.

🧠 O que estava causando lentidão?

O campo status_processo não possuía índice.
Ou seja, toda vez que essa consulta rodava, o Oracle precisava varrer milhões de linhas comparando texto — processo conhecido como full scan.

Já a coluna codigo_status, equivalente numérica do mesmo campo, era indexada.

⚙️ Como identifiquei o gargalo

  1. Pesquisei as estruturas da view
  2. Validei índices pelo dicionário de dados (USER_IND_COLUMNS, DBA_INDEXES)
  3. Comparei o custo no EXPLAIN PLAN

O plano deixava claro: o filtro por texto estava exigindo um TABLE ACCESS FULL, enquanto o código poderia sair de um INDEX RANGE SCAN — muito mais rápido.

🚀 A solução aplicada

Substituí o filtro por texto:

WHERE status_processo= 'Pendentes'

por:

WHERE codigo_status = 4

📌 Resultado:

  • Antes: timeout
  • Depois: retorno em ~3 minutos (normal dado o tamanho da view)

🧪 Antes vs Depois (simplificado)

SituaçãoTipo de filtroTipo de leituraTempoExplain Plan
AntesTexto (descricao_status)FULL TABLE SCANTimeoutCusto alto
DepoisNumérico (codigo_status)INDEX RANGE SCAN~3minCusto reduzido

💡 Macetes TecProdutiva

✔️ Sempre prefira chaves numéricas em filtros.
✔️ Evite comparar strings grandes, especialmente em views.
✔️ No Oracle, EXPLAIN PLAN e AUTOTRACE são seus melhores amigos.
✔️ Antes de pensar em criar índice, verifique quais já existem.
✔️ Views complexas + filtros inadequados = dashboard lento.

❌ Erro comum + solução

❌ ErroFiltrar por campos descritivos porque parecem mais intuitivos
✅ CorretoFiltrar por campos indexados (geralmente chaves numéricas ou IDs)

🚀 Checklist final

✔️ Use EXPLAIN PLAN quando algo estiver lento
✔️ Prefira filtros indexados (normalmente numéricos)
✔️ Evite WHERE texto = ... quando não houver índice
✔️ Teste em ambiente controlado antes de aplicar ao dashboard

🔗 Conteúdo recomendado

👉 Como melhorar performance em consultas SQL usando índices

💬 Agora é sua vez

Você já passou por uma query lenta que foi resolvida com uma mudança simples?
Ou quer ver esse mesmo caso explicado com JOIN, função ou CTE?

Comenta aqui. 👇

Compartilhe:
Elvis Amorim

Elvis Amorim

Apaixonado por tecnologia e por compartilhar conhecimento. Tenho mais de 15 anos de experiência nas áreas de varejo, administração e informática, atuando como analista de sistemas e de dados. No TecProdutiva, reúno tudo o que aprendi para ajudar pessoas a usarem a tecnologia de forma simples e produtiva.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *