Como deixar uma consulta mais rápida?

04/12/2003

12

Boa tarde a todos.

Estou usando delphi 5, Mysql e o Zeos para acessar o BD. Recentemente, um dos meus clientes atingiu a faixa de 250.000 registros em uma das minhas tabelas. Ele ligou dizendo que a consulta estava lenta. Trouxe o seu BD e constei que a minha aplicação perdeu desempenho.
Eis uma deelas:
Select * from cupomatual where (codigo = edit1.text and imp = edit2.text) order by codigo;

Na primeira vez demora um bocado, da segunda em diante já ganha velocidade.
Gostaria de saber como fazer uma consulta SQL mais rápida, pois tenho um concorrente que utiliza os mesmos componentes, porém é bem mais rápida.

Grato pela atenção.


Responder

Posts

04/12/2003

Danilorsa

Caro amigo,

O Select * from deixa muito lento....

Se você precisar de todos os campos, o correto é chamar todos eles. Por Ex:

Select TABELA.PRIMEIRO,TABELA.SEGUNDO,TABELA.ULTIMO
from TABELA.

Curiosidade: Você precisa trazer todos os campos...? Os Parâmetros são as chaves?

Faça um select apenas do que o cliente precisa.


Responder

04/12/2003

Turbo Drive

Eu já fiz isso. Mesmo assim demora um bocado. Na 1ª vez é um eternidade, da segunda em diante demora menos.

Existe alguma forma de burlar isso?


Responder

04/12/2003

Yankleber

Olá!

Existe sim.

A sugestão do colega danilorsa é procedente, pois quando você envia um SELECT *, o SGBD tem que descobrir primeiro quem é o * (listar todos os campos) e depois fazer a pesquisa. Entrentanto, já percebi que atualmente os gerenciadores de banco de dados são tão rápidos que isso não chega a causar grande impacto: andei fazendo uns testes com uma tabela contendo 500.000 registros no MSSQL e não vi diferença alguma.

Mas vamos ao que importa: o que está tornando a sua pesquisa lenta é o ORDER BY. Para diminuir absurdamente o tempo de resposta da sua pesquisa, simplesmente crie um índice para o campo CODIGO da sua tabela CUPOMATUAL. Só isso.

Um abraço!


Responder

05/12/2003

Adilsond

Com relação ao que nossos amigos falaram:

1 - Realmente se voce criar um índice pelo campo ao qual está gerando a pesquisa, será bem mais rápida a mesma.
2 - Com relação ao select *, realmente o banco terá de descobrir quem é o *. E não só isso. Se algum dia a sua tabela for criado mais algum campo, voce terá de recompilar a mesma, enquanto se voce definir os campos, não será necessário.
3 - Outra coisa que poderá fazer é, caso sua consulta sempre seja a mesma para este formulário, mudando apenas os dados dos parametros, faça um prepare de sua query no OnCreate do seu formulário e um unprepare no OnDestroy. Com isto sua consulta ficará armazenada no banco, não necessitando que a mesma seja analizada pelo ´pré-compilador´ a cada consulta.
4 - Com relação ao order by, realmente sua consulta ficara mais lenta, mais isto dependerá da quantidade de dados que será retornado.


Responder

05/12/2003

Turbo Drive

Como se cria este índice?
É que minha consulta se baseia sempre naqueles dois campos (codigo e imp), pois trata-se dos itens que o cliente está comprando no momento.


Responder

06/12/2003

Yankleber

Use algo do tipo:

CREATE  INDEX [nome_do_indice] ON [nome_da_tabela]([nome_do_campo]) ON [PRIMARY]


PS: Essa é a sintaxe no SQL-Server. Acredito que seja padrão.

Abraço!


Responder