Como deixar uma consulta mais rápida?
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.
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
Curtidas 0
Respostas
Danilorsa
04/12/2003
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.
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.
GOSTEI 0
Turbo Drive
04/12/2003
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?
Existe alguma forma de burlar isso?
GOSTEI 0
Yankleber
04/12/2003
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!
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!
GOSTEI 0
Adilsond
04/12/2003
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.
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.
GOSTEI 0
Turbo Drive
04/12/2003
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.
É que minha consulta se baseia sempre naqueles dois campos (codigo e imp), pois trata-se dos itens que o cliente está comprando no momento.
GOSTEI 0
Yankleber
04/12/2003
Use algo do tipo:
PS: Essa é a sintaxe no SQL-Server. Acredito que seja padrão.
Abraço!
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!
GOSTEI 0