VELOCIDADE ADO
Olá pessoal
Gostaria de saber se alguem aqui tem a experiencia se é melhor trabalhar com recordset (Insert, Update, Delete) no ADO ..... ou é melhor usar COMMAND???
Gostaria de saber se alguem aqui tem a experiencia se é melhor trabalhar com recordset (Insert, Update, Delete) no ADO ..... ou é melhor usar COMMAND???
A princÃpio o seu banco tem que esta todo com os campos indexados ( chaves primárias e demais Ãndices) para que a consulta possa ser feita mais rápida
Depois SEMPRE uso o recordset nos meus projetos, não rodo nada no banco, pois assim consigo controlar os campos que preciso sem ficar mandando o famoso select * from
Uma vez tive que dar a manutenção em um banco, onde a pesquisa estava demorando mais de 8 seg.
Quando fui ver não mudei nada no código, só que quem fez a estrutura do banco não fez os Ãndices corretos e com isso demorava demais a consulta quando tinha que trazer uma quantidade razoável de dados
Após melhorar os Ãndices, fiz a consulta de 8 seg cair para 0,6 e ai que fui mexer no código, tirando o select * from e colocando os campos que realmente precisa ser puxado e ai a pesquisa ficou praticamente instantânea 0,03
Depois SEMPRE uso o recordset nos meus projetos, não rodo nada no banco, pois assim consigo controlar os campos que preciso sem ficar mandando o famoso select * from
Uma vez tive que dar a manutenção em um banco, onde a pesquisa estava demorando mais de 8 seg.
Quando fui ver não mudei nada no código, só que quem fez a estrutura do banco não fez os Ãndices corretos e com isso demorava demais a consulta quando tinha que trazer uma quantidade razoável de dados
Após melhorar os Ãndices, fiz a consulta de 8 seg cair para 0,6 e ai que fui mexer no código, tirando o select * from e colocando os campos que realmente precisa ser puxado e ai a pesquisa ficou praticamente instantânea 0,03
Citação:a pesquisa ficou praticamente instantânea 0,03
O que vc fez (quais alterações no codigo) pra acelerar o trem???? essa é a questão!
é o que eu coloquei
Ajustei o bando de dados, coloquei Ãndices onde não tinha e tirei uma pancada de Ãndice duplicado, essa foi a maior mudança, que consegui reduzir para os 0,6 seg
E depois no código eu tirei os select * from e coloquei somente os campos que eu precisava puxar, por exemplo
Select * from clientes
passei para
Select nome,endereço,bairro,cidade,cep,estado,telefone from cliente
Fazendo isso em todos os chamados do banco, a pesquisa passou de 0,6 para 0,03
Geralmente o grande problema esta no banco de dados mal estruturado, depois consultas que se faz no banco, depois código que carregam dados desnecessários(select*from)
Procure sempre rodar as query de consulta na máquina local, nada no banco
Procure deixar todos os campos das tabelas com Ãndices
Ex
Tabela Item
CodItem (Ãndice e chave primaria)
codFornecedor (chave e Ãndice )
descricao
estoque
valor
Tabela Fornecedor
CodFornecedor (Ãndice e chave primaria)
Razaosocial
endereco
Dessa forma por exemplo não importa o que vc queira buscar, sempre irá carregar rápido os item de um fornecedor
Procure sempre olhar isso no banco, criar campos de relacionamento entre as tabelas e deixar eles como chave e Ãndices, isso ajuda pacas o banco se organizar em uma consulta, não importa que banco seja
Se tiver alguma dúvida pode perguntar
Ajustei o bando de dados, coloquei Ãndices onde não tinha e tirei uma pancada de Ãndice duplicado, essa foi a maior mudança, que consegui reduzir para os 0,6 seg
E depois no código eu tirei os select * from e coloquei somente os campos que eu precisava puxar, por exemplo
Select * from clientes
passei para
Select nome,endereço,bairro,cidade,cep,estado,telefone from cliente
Fazendo isso em todos os chamados do banco, a pesquisa passou de 0,6 para 0,03
Geralmente o grande problema esta no banco de dados mal estruturado, depois consultas que se faz no banco, depois código que carregam dados desnecessários(select*from)
Procure sempre rodar as query de consulta na máquina local, nada no banco
Procure deixar todos os campos das tabelas com Ãndices
Ex
Tabela Item
CodItem (Ãndice e chave primaria)
codFornecedor (chave e Ãndice )
descricao
estoque
valor
Tabela Fornecedor
CodFornecedor (Ãndice e chave primaria)
Razaosocial
endereco
Dessa forma por exemplo não importa o que vc queira buscar, sempre irá carregar rápido os item de um fornecedor
Procure sempre olhar isso no banco, criar campos de relacionamento entre as tabelas e deixar eles como chave e Ãndices, isso ajuda pacas o banco se organizar em uma consulta, não importa que banco seja
Se tiver alguma dúvida pode perguntar
USE SQL DIRETO TANTO PARA INSERT, SELECT, UPDATE OU DELETE
Dim rs As ADODB.Recordset
Set rs = DBADO.Execute([Ô]SELECT * FROM tabela WHERE ID=[Ô] & txtid)
If Not rsCT.EOF Then
MUITO MAIS RAPIDO
ATE +
Dim rs As ADODB.Recordset
Set rs = DBADO.Execute([Ô]SELECT * FROM tabela WHERE ID=[Ô] & txtid)
If Not rsCT.EOF Then
MUITO MAIS RAPIDO
ATE +
Citação:USE SQL DIRETO TANTO PARA INSERT, SELECT, UPDATE OU DELETE
Essa é o X da questão ..... qual o melhor método que agiliza .... não falo só da pesquisa, falo de inserir, deletar ou alterar!!!
Melhor forma para Update,Insert e Select.
Sql = Insert into
Sql = Update
Banco.Execute(Sql)
Select foi mencionado acima.
Muito importante BeginTrans, CommitTrans e RollBackTrans.
Garantia.
Sql = Insert into
Sql = Update
Banco.Execute(Sql)
Select foi mencionado acima.
Muito importante BeginTrans, CommitTrans e RollBackTrans.
Garantia.
Omar é possivel um exemplo prático de cada um deles? esses [Ô]trans[Ô] desconheço ... toda vida eu usada básico do DAO ... depois migrei pra ADO pra acessar access 2007 ou posterior ...
Colega Episcopal,
Os comandos SQL ficarão rápidos, tanto para insert, update, delete (isto se chama linguagem DML de Data Manipulation Language), na forma como o colega BRUNELLINFO escreveu e eu cito abaixo...
Claro, banco de dados bem indexado vai ajudar em muito os comandos ficarem ainda mais rápidos. Se você criar Ãndices demais e criar Ãndices para campos desnecessários, o sistema poderá ficar lento ao invés de rápido, porque cada comando insert/update/delete (DML) que for executado precisará atualizar os Ãndices. Indexar é ótimo, mas tem que ser bem pensado.
O que o nosso colega OMAR2011 quis dizer é usar begin/commit (talvez até rollback) para garantir que os dados sejam atualizados no BD apenas se tudo der OK.
Exemplo:
O comando acima vai sedr executado e o que for mudado no banco de dados é irreversÃvel.
Agora assim...
No caso acima, os dois comandos update só serão executados se nenhum deles apresentar erro. O RollBack seria para fazer voltar atrás o que já tenha sido realizado em caso de erro. O funcionamento do Begin/Commit/RollBack pode mudar um pouquinho entre cada banco de dados (PostGreSQL, MySQL, SQL Server, Oracle, DB2, etc).
Como complemento, vale lembrar que o MySQL, ao contrário do que muitos pensam, não é gratuito, é pago (valor pequeno, mas é pago). Quando você contrata os serviços de hospedagem e parece nada pagar por ele, na verdade é que o preço do MySQL que o provedor de hospedagem está pagando não é repassado, mas ele (provedor) paga (ou deveria). A única versão gratuita do MySQL chama-se MySQL Community e pode ser usada apenas para fins próprios ou acadêmicos. A Oracle comprou os fontes do MySQL e ela mesma vende o BD Oracle, seria um [Ô]tiro no pé[Ô] dar o MySQL se querem vender o Oracle. No lugar do MySQL veio o MariaDB (também é bom).
Se puder sugerir algo, te aconselharia a deixar o Access e migrar para um banco mais profissional, com disponibilidade de ACID, por exemplo (todos os mencionados acima suportam ACID). Mas tuas migrações podem ser lentas, com calma, não precisa pressa.
Tudo de bom.
Os comandos SQL ficarão rápidos, tanto para insert, update, delete (isto se chama linguagem DML de Data Manipulation Language), na forma como o colega BRUNELLINFO escreveu e eu cito abaixo...
Citação:
Dim rs As ADODB.Recordset
Set rs = DBADO.Execute([Ô]SELECT * FROM tabela WHERE ID=[Ô] & txtid)
Claro, banco de dados bem indexado vai ajudar em muito os comandos ficarem ainda mais rápidos. Se você criar Ãndices demais e criar Ãndices para campos desnecessários, o sistema poderá ficar lento ao invés de rápido, porque cada comando insert/update/delete (DML) que for executado precisará atualizar os Ãndices. Indexar é ótimo, mas tem que ser bem pensado.
O que o nosso colega OMAR2011 quis dizer é usar begin/commit (talvez até rollback) para garantir que os dados sejam atualizados no BD apenas se tudo der OK.
Exemplo:
update tab_clientes set nome = [ô]FULANO[ô] where cod_cli = 70
O comando acima vai sedr executado e o que for mudado no banco de dados é irreversÃvel.
Agora assim...
Begin;
update tab_clientes set nome = [ô]FULANO[ô] where cod_cli = 70;
update tab_produtos set descricao = [ô]PRODUTO PARA VENDA[ô] where cod_produto = 56;
Commit;
No caso acima, os dois comandos update só serão executados se nenhum deles apresentar erro. O RollBack seria para fazer voltar atrás o que já tenha sido realizado em caso de erro. O funcionamento do Begin/Commit/RollBack pode mudar um pouquinho entre cada banco de dados (PostGreSQL, MySQL, SQL Server, Oracle, DB2, etc).
Como complemento, vale lembrar que o MySQL, ao contrário do que muitos pensam, não é gratuito, é pago (valor pequeno, mas é pago). Quando você contrata os serviços de hospedagem e parece nada pagar por ele, na verdade é que o preço do MySQL que o provedor de hospedagem está pagando não é repassado, mas ele (provedor) paga (ou deveria). A única versão gratuita do MySQL chama-se MySQL Community e pode ser usada apenas para fins próprios ou acadêmicos. A Oracle comprou os fontes do MySQL e ela mesma vende o BD Oracle, seria um [Ô]tiro no pé[Ô] dar o MySQL se querem vender o Oracle. No lugar do MySQL veio o MariaDB (também é bom).
Se puder sugerir algo, te aconselharia a deixar o Access e migrar para um banco mais profissional, com disponibilidade de ACID, por exemplo (todos os mencionados acima suportam ACID). Mas tuas migrações podem ser lentas, com calma, não precisa pressa.
Tudo de bom.
minha migração não é só de banco .... é de IDE
Citação::
USE SQL DIRETO TANTO PARA INSERT, SELECT, UPDATE OU DELETE
Dim rs As ADODB.Recordset
Set rs = DBADO.Execute([Ô]SELECT * FROM tabela WHERE ID=[Ô] & txtid)
If Not rsCT.EOF Then
MUITO MAIS RAPIDO
ATE +
Isso foi o que eu tirei dos códigos, um banco mal indexado como coloquei, faz a pesquisa demorar e muito
Más após o ajuste no banco de dados a pesquisa começou a ser feita rápida, mesmo com esse select * from. Provavelmente o banco do BRUNELLINFO esteja bem indexado, por isso que a pesquisa seja rápida
Como o colega Zeuzebio colocou, a indexação do banco tem que ser muito bem pensada
E também aconselho a troca de banco, más tem que ir muito na calma, porque principalmente os campos datas serão muito afetados, por exemplo para gravar uma data no mysql, vc tem que gravar no formato YYYY-MM-DD
Achei uma video que ensina alguns comandos DML e DDL
Comandos DDL
Estava vendo e vale a pena ganhar um tempo assistindo a aula
Tópico encerrado , respostas não são mais permitidas