Otimizando query no Oracle 11g

Tenho uma consulta simples que uso para exibir dados do BD num gráfico de barras do JFreechart:

consulta="SELECT "+DescEixoX+",COUNT("+DescEixoX+") FROM "+nome_tabela+" GROUP BY "+DescEixoX+" HAVING COUNT("+DescEixoX+") >='"+minimo+"' AND COUNT("+DescEixoX+") <='"+maximo+"' ORDER BY COUNT("+DescEixoX+")";
Onde DescEixoX é o campo selecionado numa combo na interface do usuário, com minimo e maximo sendo valores digitado pelo usuário.
Até aí tudo bem, sem problemas o gráfico é gerado.
Só que as vezes, eu quero saber a fundo os registros que estão contidos nesse gráfico, aí faço:

String query_interna="SELECT "+DescEixoX+" FROM "+nome_tabela+" GROUP BY "+DescEixoX+" HAVING COUNT("+DescEixoX+") BETWEEN '"+minimo+"' AND '"+maximo+"' "; atualizar_tabela="SELECT * FROM "+nome_tabela+" WHERE "+DescEixoX+" IN ("+query_interna+")";

Funcionava OK, quando o sistema tinha 20,30 ou 40 mil linhas.Com 500mil, trava direto, mesmo que só tenham 10 registros no retorno da consulta.Como otimizar essa contagem sem travar?

Ignorando que isso pode ser facilmente alvo de SQL Injection e concentrando apenas na parte de SQL, eu diria que criar índices nos campos que podem ser utilizados em “DescEixoX” é um bom começo.

É Swing, e protótipo monousuário, sem problemas de SQL injection.Ter o banco na mesma máquina já seria um problema beeem maior do que SQL injection…Para a web a abordagem é outra.

Desconfiei que não poderia estar dando problemas com tão poucos registros(ainda que 10X o que tinha) e descobri uma “sujeira” de dados acumulados e tabelas não usadas anteriormente.Limpei tudo e a coisa é outra.