Com a intenção de contribuir com os demais colegas, fiz alguns estudos e testes relacionados à
velocidade de processamento de grandes massas de dados. Nos testes utilizei apenas recordsets
por achar mais fácil a manipulação.
Tendo em vista o surgimento do ADO, faz mais de 4 anos que não trabalho mais com o DAO
que, inclusive, já fora descontinuado pela Microsoft. Achei bastante flexível o trabalho
com ADO na forma de rst. Apesar de processamento mais rápido, não gosto de trabalhar com
consultas SQL (insert into, update, etc...), pois entendo que são mais difíceis de se criar
instruções que detenham alguns parâmetros, como, por exemplo atualizações com critérios.
Como sempre manipulava pouca quantidade de dados de cada vez, não senti diferença
de performance entre DAO e ADO.
Há algumas semanas, surgiu-me a necessidade de fazer uma atualização de registros em uma base
de dados ACCESS 2000 com cerca de 110.000 registros. A tabela possui poucos campos e a base
fora compactada antes da operação. A atualização consiste, basicamente, em apropriar um valor
limite (sTeto) ao campo especificado. A forma de atualização está descrita no algorítimo abaixo:
'__________________________________________________________________________________________________
Private Sub AtualizaDados()
Screen.MousePointer = 11
Dim sTeto As Currency
Dim sCompAtual As String
Dim sCpfAtual As String
Dim sCompAntigo As String
Dim sCpfAntigo As String
Dim sVrAntigo As Currency
Dim iTotReg As Long
sTeto = 1869.34
sSql = "SELECT * FROM tblDuplicatas"
Rst.Open sSql, cnBd, adOpenKeyset, adLockOptimistic
Rst.MoveMin
sCpfAntigo = Rst!Cpf
sVrAntigo = Rst!Total
Do While Not Rst.EOF
Rst!Processado = "S"
If sVrAntigo < sTeto Then
Rst!VrBase = sVrAntigo
sTeto = sTeto - sVrAntigo
ElseIf (sVrAntigo + 0.01) > sTeto Then
Rst!VrBase = sTeto
sTeto = 0
End If
Rst.Update
Rst.MoveNext
If Not Rst.EOF And Not Rst.BOF Then
If sCpfAntigo <> Rst!Cpf Then
sCpfAntigo = Rst!Cpf
sVrAntigo = Rst!Total
sTeto = 1869.34
Else
sVrAntigo = Rst!Total
End If
End If
Loop
FecharRst
Screen.MousePointer = 0
MsgBox "Atualização efetuada com sucesso ", vbExclamation, "Apuração da Base de Cálculo!!"
Exit Sub
End Sub
'__________________________________________________________________________________________________
Quando processada uma quantidade inferior a 6.000 registros, não houve grande demanda de tempo;
mas para minha surpresa, quando mandei processar a tabela com mais de 104.000 registros, o processamento
demorou mais de 4 horas para ser concluído.
Não conformado com tanta demora, resolvi migrar o banco para MySql e para Firebird e a demora foi ainda
superior às 4 horas obtidas no Access.
Por acaso, resolvi processar o código acima usando o DAO com ACCESS 2000 e tive uma SUPRESA!!!!
O processamento de atualização feito com DAO foi muito mais rápido (em segundos), se comparado com ADO.
Abaixo, segue a tabela com as conclusões:
BdDadosM (12.229 registros)
Ado: 00:00:32
Dao: 00:00:07
BdDadosG (82.062 registros)
Ado: 00:02:54
Dao: 00:00:32
BdDadosGG (104.623 registros)
Ado: 04:19:05
Dao: 00:00:40
Depois do resultado, acabei concluindo que ainda não aprendi a trabalhar com ADO, vez que a diferença
no processamento das informações, em relação ao DAO, é de grande relevância num programa. Assim sendo,
gostaria de saber se a forma acima é a melhor de se trabalhar com o ADO, ou se sua performance só
melhora utilizando-se de consultas ação (INSERT INTO, UPDATE..).
Se alguém tiver alguma crítica ou sugestão, gostaria que colocasse para discussão, principalmente, se
o código de atualização postado acima estiver com alguma inconsistência (na prática, ele funciona)..
É isso aí..