Como deixar uma consulta mais rápida?
04/12/2003
0
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.
Turbo Drive
Posts
04/12/2003
Danilorsa
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.
04/12/2003
Turbo Drive
Existe alguma forma de burlar isso?
04/12/2003
Yankleber
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!
05/12/2003
Adilsond
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.
05/12/2003
Turbo Drive
É que minha consulta se baseia sempre naqueles dois campos (codigo e imp), pois trata-se dos itens que o cliente está comprando no momento.
06/12/2003
Yankleber
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!
Clique aqui para fazer login e interagir na Comunidade :)