OVH Cloud OVH Cloud

rushmore contre DAO

4 réponses
Avatar
keops
bonjour à tous
ma Question est un peu technique , J'aimerais comprendre en utilisant la
technique currentdb.execute SQL (il s'agit d'ajouter 180 000 enreg dans une
table) je mets 17 secondes
et en utilisant la methode vba par DAO
with rst
.addnew
.field(0)=bla blabla
.field(1)= bla bla bla
.update
end with
je mets plus du double (40 secondes)

merci de vos explications

4 réponses

Avatar
Wlad69
Bonjour,

Ma réponse est un peu intuitive et des spécialistes l'expliqueraient
surement mieux que moi, mais d'un côté tu effectues un INSERT, et de
l'autre une mise à jour enregistrement par enregistrement. A chaque
update en DAO le moteur Jet met à jour la table et un certain nombre
d'élément comme les index, ou les informations de verrouillage
d'enregistrement, etc... . Alors que quand tu fais un INSERT il n'y a
qu'une seule opération de MAJ de la table.



bonjour à tous
ma Question est un peu technique , J'aimerais comprendre en utilisant la
technique currentdb.execute SQL (il s'agit d'ajouter 180 000 enreg dans u ne
table) je mets 17 secondes
et en utilisant la methode vba par DAO
with rst
.addnew
.field(0)=bla blabla
.field(1)= bla bla bla
.update
end with
je mets plus du double (40 secondes)

merci de vos explications


Avatar
3stone
Salut,

"keops"
| ma Question est un peu technique , J'aimerais comprendre en utilisant la
| technique currentdb.execute SQL (il s'agit d'ajouter 180 000 enreg dans une
| table) je mets 17 secondes
| et en utilisant la methode vba par DAO
| with rst
| .addnew
| .field(0)=bla blabla
| .field(1)= bla bla bla
| .update
| end with
| je mets plus du double (40 secondes)


Chouette, le SQL hein ? ;-)

Sache que rien ne peut être plus rapide que le SQL (dans un usage correct)
C'est le language des base de données et qu'il faut toujours préférer
lorsque l'on arrive à exprimer sa "phrase" correctement.

Le recordset DAO à toutes les raisons d'exister et apporte plus de souplesse
lorsqu'il s'agit de traiter les enregistrements un par un !
Ce qui n'est pas possible par SQL (on traite tout le recordset)

Souvent, une combinaison des deux est la meilleure méthode.
Tu base ton rst sur un "Select ... From table Where 'restiction' "

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/
Avatar
keops
wlad69

c'est vrai ton analyse, mais j ai observé que sans le .update rien ne se
produisait.
tu m 'eclaires beaucoup sur le fonctionnement du moteur jet; ce qui m ammene
a cette 2e question Aquoi servent les maj du moteur jet je crois qu on est a
la 4.0
Pourquoi y a t il pres de 15 secondes d'ecart entre dbopenTable et
dbopenDynaset ?

Merci en tous les cas.

"Wlad69" a écrit dans le message de news:

Bonjour,

Ma réponse est un peu intuitive et des spécialistes l'expliqueraient
surement mieux que moi, mais d'un côté tu effectues un INSERT, et de
l'autre une mise à jour enregistrement par enregistrement. A chaque
update en DAO le moteur Jet met à jour la table et un certain nombre
d'élément comme les index, ou les informations de verrouillage
d'enregistrement, etc... . Alors que quand tu fais un INSERT il n'y a
qu'une seule opération de MAJ de la table.



bonjour à tous
ma Question est un peu technique , J'aimerais comprendre en utilisant la
technique currentdb.execute SQL (il s'agit d'ajouter 180 000 enreg dans
une
table) je mets 17 secondes
et en utilisant la methode vba par DAO
with rst
.addnew
.field(0)=bla blabla
.field(1)= bla bla bla
.update
end with
je mets plus du double (40 secondes)

merci de vos explications


Avatar
keops
3Stone Salutations

donc ça c'est du SQL ? 180 000 CLIENT 17 secondes

CurrentDb.Execute "Delete CLI2005.REF, CLI2005.NOM, CLI2005.COMPAD,
CLI2005.CBP, CLI2005.LIBCOM FROM CLI2005;"
pdc = "INSERT INTO cli2005 ( NOM, REF, COMPAD, CBP, LIBCOM )"
pdc = pdc & "SELECT EDF.nom, EDF.ref,
LTrim(Trim(IIf(len([numvoie])=0,'',[Numvoie]) & ' ' & [compad])) AS adresse,
EDF.cpostal, EDF.ville FROM EDF;"
CurrentDb.Execute pdc

La meme chose en vba methode DAO
**********************************
'Dim pdc, adresse As String
'Dim tt As Date
'Dim rst, rstcli As DAO.Recordset
'Dim lnglignes, position As Long
'Set rst = CurrentDb.OpenRecordset("edf", dbOpenDynaset) '>>> j'hésite entre
Dynaset et opentable ????
'If rst.EOF Then
' lnglignes = 0
'Else
' rst.MoveLast
' lnglignes = rst.RecordCount
'End If
'Me.nbenreg = lnglignes
CurrentDb.Execute "Delete CLI2005.REF, CLI2005.NOM, CLI2005.COMPAD,
CLI2005.CBP, CLI2005.LIBCOM FROM CLI2005;"
'lnglignes1 = 0
'Set rstcli = CurrentDb.OpenRecordset("cli2005", dbOpenTable)
'rst.MoveFirst
'rst.MoveNext
'tt = Time
'Me.nbenreg = lnglignes & " Enreg. "
'While Not rst.EOF
'If Len(rst.Fields("numvoie")) = 0 Then
'adresse = rst.Fields("compad")
' Else
' adresse = rst.Fields("numvoie") & " " & rst.Fields("compad")
'End If
'adresse = LTrim(Trim(adresse))
'With rstcli
'.AddNew
' .Fields("ref") = IIf(Val(rst.Fields("ref")) = 0, "Résiliation",
rst.Fields("ref"))
' .Fields("nom") = rst.Fields("nom")
' .Fields("compad") = adresse
' .Fields("CBP") = rst.Fields("cpostal")
'.Fields("libcom") = rst.Fields("ville")
'.Update
'lnglignes1 = lnglignes1 + 1
'rst.MoveNext
'End With
'Wend
'rstcli.Close
'rst.Close
'Set rstcli = Nothing
'Set rst = Nothing

et ça mets 20 secondes de Plus
je suis ouvert à toutes amelioration .

"3stone" a écrit dans le message de news:

Salut,

"keops"
| ma Question est un peu technique , J'aimerais comprendre en utilisant la
| technique currentdb.execute SQL (il s'agit d'ajouter 180 000 enreg dans
une
| table) je mets 17 secondes
| et en utilisant la methode vba par DAO
| with rst
| .addnew
| .field(0)=bla blabla
| .field(1)= bla bla bla
| .update
| end with
| je mets plus du double (40 secondes)


Chouette, le SQL hein ? ;-)

Sache que rien ne peut être plus rapide que le SQL (dans un usage correct)
C'est le language des base de données et qu'il faut toujours préférer
lorsque l'on arrive à exprimer sa "phrase" correctement.

Le recordset DAO à toutes les raisons d'exister et apporte plus de
souplesse
lorsqu'il s'agit de traiter les enregistrements un par un !
Ce qui n'est pas possible par SQL (on traite tout le recordset)

Souvent, une combinaison des deux est la meilleure méthode.
Tu base ton rst sur un "Select ... From table Where 'restiction' "

--
A+
Pierre (3stone) Access MVP
Perso: http://www.3stone.be/
Conseils MPFA: http://www.mpfa.info/