Como Otimizar Buscar ao maximo?

Olá pessoal,
Estou tendo alguns problemas com consultas SQL.
Vejam meu caso, imaginem um banco com 1 milhão e clientes.
Quando tento buscar algo tipo Maria, a busca faz um Like ‘Mari%’ e então acontece um timeout pois são muito registros.
Quais as possiveis soluções para esse problema?

Dependendo do banco e do “LIKE” que você for usar, até é possível usar o índice para isso.

No seu exemplo em particular, LIKE ‘Mari%’ é transformado pelo banco por algo como “BETWEEN ‘Mari’ AND 'MariZZZZZZZZZ” ou algo parecido.

Mas se o LIKE for algo como “LIKE %MARI%” ou “LIKE %MARI” então não há índice que dê jeito nisso. Portanto, limite os tipos de consultas que você pode fazer.

Outra forma é usar os recursos de data warehousing do seu banco.

Acontece um timeout porque você está retornando muitos registros?
Você precisa de todos os registros?!

Se você for paginar, tente achar algum recurso no seu banco pra retornar menos registros…

No MySQL por exemplo, existe a instruçao LIMIT …

Respondendo a os 2 post anteriores.
As buscas são feitas somente com Like ‘mari%’
E o banco e o Oracle 9i, e a aplicação tem paginador sim, e realmente dá timeout pois retorna muitos registros ou nem chega apercorer todos os registros que o banco tem, nunca vi nada tão grande.
Qual a melhor solução?

O que você tá usando aí? Servlet, algum framework? jsp?

Isso Servlet, que joga o resultado em um jsp, agora o framework e proprio. Mas e um consulta simples nada de anormal, só muitos dados no banco mesmo.

Quantas Marias, Marianas e Maricleides!
Provavelmente, fora o LIKE, deve-se fazer duas coisas:

  • Ver se você está usando algo como UPPER(nome) LIKE ‘MARI%’ ou nome LIKE ‘Mari%’. Se não me engano, o primeiro não usa o índice (table scan), e o segundo usa.
  • O velho e bom ROWID está sendo usado também, não?

Meus conhecimentos limitados de banco de dados me dizem que um LIKE sempre fará um full table scan!

Estou errado? Existe indice para LIKE ???

Se não me engano, quando o “wildcard” do LIKE fica só no fim, alguns bancos interpretam isso como BETWEEN ____ AND ____, e podem usar o índice. Não sei se o Oracle faz isso, e se a versão do Oracle que o OP usou faz isso; só solicitando um plano de execução para ver se ele realmente vai usar o índice, ou se vai fazer um table scan.

hm…

Pessoal acho que vou fazer assim:
select * from (select a.*, rownum rnum from (tabela) a
where rownum &lt= 10000) where rnum &gt= 1 and NM_PES like ‘MARI%’

Oque acham?

Sugiro você fazer um explain plan dessa consulta. O Oracle já tem um script que cria a tabela que conterá o resultado do plano de execução.

Execute o arquivo unidade:\orant\RDBMS73\ADMIN\UTLXPLAN.SQL na conta que é owner do seu sistema. Ele vai criar a tabela plan_table e depois lá no sql/plus digite set autotrace on.

Ao executar qualquer consulta será gerado um retorno das estatísticas no próprio sql/plus.

Pra desligar digite set autotrace off

Veja se não tem como melhorar a consulta pra ser mais rápida. Se você diz que tem paginação, procure fazer a consulta não total e depois pegar os primeiros 100, mas sim consultar somente os trechos conforme navega.

Não tem como fazer isso pois quem cuida da paginação eo framework, e ele faz a consulta inteira mesmo, ai nem deixariam mexer no paginador :cry:
Vou testar esse esquema ai que vc falou.
Mas voltando ao sql acredito que tem que ser assim mesmo né?

nao rola usar hibernate + lucene ?

http://www.hibernate.org/hib_docs/annotations/reference/en/html/lucene.html