Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Petit benchmark avec des résultats étonnants.

3 réponses
Avatar
chew.baka
Bonjour à tous !

J'ai écrit un petit programme en VB dans le but de comparer les
rapidités d'Access et SQL Server en insertion.
J'insère donc 10 000 enregistrements dans une table de chacun des deux
systèmes. Je pensais que SQL Server serait au moins équivalent, si ce
n'est plus rapide qu'Access...
Voici mes résultats :

en local :
Access : 0 secondes !!!!!
SQL Server : entre 63 et 68 secondes !

en réseau, avec 4 PC faisant tourner le même programme en même temps
(ils sont synchronisés : le test ne démarre qu'en présence d'un
fichier bien précis sur le réseau et cette présence est testée toutes
les 5 millisecondes avant que le test ne démarre) :
Access : planté sur 2 PC sur les 4 avec une erreur renvoyant un
verrouillage, 6 secondes sur les 2 autres PC,
SQL Server : planté sur 1 PC avec une erreur incompréhensible (une
méthode ~ incorrecte sur un objet ~ !!?), sur les trois autres des
temps qui tournent autour de 125 !!!!

Ces chiffres sont pour moi complètement irréels, surtout le 0 secondes
pour 10 000 boucles d'insertions sur Access. A l'inverse, 125 secondes
sur un réseau certes chargé et sur une table utilisée par trois
programmes, ça me paraît énorme.

Quelqu'un a-t-il un début d'explication à ces résultats délirants ?
Merci d'avance,

Via :)

PS :
Voici le code du programme (du moins de la partie qui nous intéresse)
:

Select Case Test
Case FIN
Unload Me
Exit Sub

Case ACCESS, ACCESS + SQLSERVER

Me.Caption = "Test Access en cours..."

DBEngine.SystemDB = "\\Serveur\COPTIS\Test\SYS.COR"

Set wEspacedeTravail = DBEngine.CreateWorkspace("Test",
"xxxx", "xxxx")
DBEngine.Workspaces.Append wEspacedeTravail
Set dBaseDeDonnées =
DBEngine.Workspaces("Test").OpenDatabase("\\Serveur\COPTIS\Test\Test.mdb",
False, False)

'Test en ajout
SQL = "SELECT Test FROM Test;"

TDepart = Time

Set RsDAO = dBaseDeDonnées.OpenRecordset(SQL, dbOpenDynaset,
dbConsistent)

For Index = 1 To NbOccurences

RsDAO.AddNew
RsDAO!Test = Index
RsDAO.Update

Next Index

Text1.Text = DateDiff("s", TDepart, Time)

If Test = ACCESS + SQLSERVER Then
Test = SQLSERVER
GoTo Test
End If

Case SQLSERVER

Me.Caption = "Test SQL Server en cours..."

Set ConnexionSQLServer = CreateObject("ADODB.Connection")
ConnexionSQLServer.Open "Provider=SQLOLEDB;Data
Source=Coptis;Initial Catalog=Test;User ID=xxxx;Password=xxxx"

SQL = "SELECT Test FROM Test;"

TDepart = Time

Set RsADO = New ADODB.Recordset
RsADO.CursorLocation = adUseClient
RsADO.Open SQL, ConnexionSQLServer, adOpenDynamic,
adLockOptimistic

For Index = 1 To NbOccurences

RsADO.AddNew
RsADO!Test = Index
RsADO.Update

Next Index

Text2.Text = DateDiff("s", TDepart, Time)

End Select

3 réponses

Avatar
Vuillermet Jacques
1- Pour insérer 10 000 enregistrements, je ne passerai pas forcément par une
boucle.

2 - Pour SQL Server, essaie avec :
RsADO.CursorLocation = adUseServer
Je pense que cela devrait faire moins d'aller-retour C/S.

Jacques.

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

Bonjour à tous !

J'ai écrit un petit programme en VB dans le but de comparer les
rapidités d'Access et SQL Server en insertion.
J'insère donc 10 000 enregistrements dans une table de chacun des deux
systèmes. Je pensais que SQL Server serait au moins équivalent, si ce
n'est plus rapide qu'Access...
Voici mes résultats :

en local :
Access : 0 secondes !!!!!
SQL Server : entre 63 et 68 secondes !

en réseau, avec 4 PC faisant tourner le même programme en même temps
(ils sont synchronisés : le test ne démarre qu'en présence d'un
fichier bien précis sur le réseau et cette présence est testée toutes
les 5 millisecondes avant que le test ne démarre) :
Access : planté sur 2 PC sur les 4 avec une erreur renvoyant un
verrouillage, 6 secondes sur les 2 autres PC,
SQL Server : planté sur 1 PC avec une erreur incompréhensible (une
méthode ~ incorrecte sur un objet ~ !!?), sur les trois autres des
temps qui tournent autour de 125 !!!!

Ces chiffres sont pour moi complètement irréels, surtout le 0 secondes
pour 10 000 boucles d'insertions sur Access. A l'inverse, 125 secondes
sur un réseau certes chargé et sur une table utilisée par trois
programmes, ça me paraît énorme.

Quelqu'un a-t-il un début d'explication à ces résultats délirants ?
Merci d'avance,

Via :)

PS :
Voici le code du programme (du moins de la partie qui nous intéresse)
:

Select Case Test
Case FIN
Unload Me
Exit Sub

Case ACCESS, ACCESS + SQLSERVER

Me.Caption = "Test Access en cours..."

DBEngine.SystemDB = "ServeurCOPTISTestSYS.COR"

Set wEspacedeTravail = DBEngine.CreateWorkspace("Test",
"xxxx", "xxxx")
DBEngine.Workspaces.Append wEspacedeTravail
Set dBaseDeDonnées > DBEngine.Workspaces("Test").OpenDatabase("ServeurCOPTISTestTest.mdb",
False, False)

'Test en ajout
SQL = "SELECT Test FROM Test;"

TDepart = Time

Set RsDAO = dBaseDeDonnées.OpenRecordset(SQL, dbOpenDynaset,
dbConsistent)

For Index = 1 To NbOccurences

RsDAO.AddNew
RsDAO!Test = Index
RsDAO.Update

Next Index

Text1.Text = DateDiff("s", TDepart, Time)

If Test = ACCESS + SQLSERVER Then
Test = SQLSERVER
GoTo Test
End If

Case SQLSERVER

Me.Caption = "Test SQL Server en cours..."

Set ConnexionSQLServer = CreateObject("ADODB.Connection")
ConnexionSQLServer.Open "Provider=SQLOLEDB;Data
Source=Coptis;Initial Catalog=Test;User ID=xxxx;Password=xxxx"

SQL = "SELECT Test FROM Test;"

TDepart = Time

Set RsADO = New ADODB.Recordset
RsADO.CursorLocation = adUseClient
RsADO.Open SQL, ConnexionSQLServer, adOpenDynamic,
adLockOptimistic

For Index = 1 To NbOccurences

RsADO.AddNew
RsADO!Test = Index
RsADO.Update

Next Index

Text2.Text = DateDiff("s", TDepart, Time)

End Select


Avatar
Patrice
Il est toujours difficile de comparer directement deux choses différentes
(malgré les apparences) :
- DAO écrit directement dans le fichier local
- ADO envoie des instructions SQL au serveur (même local) et peut par
exemple dans le cas d'une mise à jour gérer également le verrouillage
optimiste (ce qui peut poser problème dans certains cas).

Pour cette raison, il existe sans doute des méthodes plus efficaces pour
charger des données en masse dans le cas de SQL Server.

Tu peux aussi voir ce que donne un objet "Command" pour exécuter une chaîne
SQL préparée plutôt que d"utiliser un recordset. Cela devrait déjà fournir
un premier gain en efficacité avec peu de changement...

Patrice

--

"Via" a écrit dans le message de
news:
Bonjour à tous !

J'ai écrit un petit programme en VB dans le but de comparer les
rapidités d'Access et SQL Server en insertion.
J'insère donc 10 000 enregistrements dans une table de chacun des deux
systèmes. Je pensais que SQL Server serait au moins équivalent, si ce
n'est plus rapide qu'Access...
Voici mes résultats :

en local :
Access : 0 secondes !!!!!
SQL Server : entre 63 et 68 secondes !

en réseau, avec 4 PC faisant tourner le même programme en même temps
(ils sont synchronisés : le test ne démarre qu'en présence d'un
fichier bien précis sur le réseau et cette présence est testée toutes
les 5 millisecondes avant que le test ne démarre) :
Access : planté sur 2 PC sur les 4 avec une erreur renvoyant un
verrouillage, 6 secondes sur les 2 autres PC,
SQL Server : planté sur 1 PC avec une erreur incompréhensible (une
méthode ~ incorrecte sur un objet ~ !!?), sur les trois autres des
temps qui tournent autour de 125 !!!!

Ces chiffres sont pour moi complètement irréels, surtout le 0 secondes
pour 10 000 boucles d'insertions sur Access. A l'inverse, 125 secondes
sur un réseau certes chargé et sur une table utilisée par trois
programmes, ça me paraît énorme.

Quelqu'un a-t-il un début d'explication à ces résultats délirants ?
Merci d'avance,

Via :)

PS :
Voici le code du programme (du moins de la partie qui nous intéresse)
:

Select Case Test
Case FIN
Unload Me
Exit Sub

Case ACCESS, ACCESS + SQLSERVER

Me.Caption = "Test Access en cours..."

DBEngine.SystemDB = "ServeurCOPTISTestSYS.COR"

Set wEspacedeTravail = DBEngine.CreateWorkspace("Test",
"xxxx", "xxxx")
DBEngine.Workspaces.Append wEspacedeTravail
Set dBaseDeDonnées > DBEngine.Workspaces("Test").OpenDatabase("ServeurCOPTISTestTest.mdb",
False, False)

'Test en ajout
SQL = "SELECT Test FROM Test;"

TDepart = Time

Set RsDAO = dBaseDeDonnées.OpenRecordset(SQL, dbOpenDynaset,
dbConsistent)

For Index = 1 To NbOccurences

RsDAO.AddNew
RsDAO!Test = Index
RsDAO.Update

Next Index

Text1.Text = DateDiff("s", TDepart, Time)

If Test = ACCESS + SQLSERVER Then
Test = SQLSERVER
GoTo Test
End If

Case SQLSERVER

Me.Caption = "Test SQL Server en cours..."

Set ConnexionSQLServer = CreateObject("ADODB.Connection")
ConnexionSQLServer.Open "Provider=SQLOLEDB;Data
Source=Coptis;Initial Catalog=Test;User ID=xxxx;Password=xxxx"

SQL = "SELECT Test FROM Test;"

TDepart = Time

Set RsADO = New ADODB.Recordset
RsADO.CursorLocation = adUseClient
RsADO.Open SQL, ConnexionSQLServer, adOpenDynamic,
adLockOptimistic

For Index = 1 To NbOccurences

RsADO.AddNew
RsADO!Test = Index
RsADO.Update

Next Index

Text2.Text = DateDiff("s", TDepart, Time)

End Select


Avatar
Fred BROUARD
on ne peut tester ce genre de chose qu'à code strictement équivalant :

1) le script est-il en "PUR" SQL ou fait-il appel à un bout de programme
"client" genre VB ?

2) quel est le niveau d'isolation transactionnel ?

3) y a t-il gestion de transaction ?

4) les données sont elles bien physiquement écrites (persistence) ? Par exemple,
si je coupe brutalement le courant après les 0 secondes d'accès, que vais-je
retrouver au démarrage ?

Un SGBDR bien conçu doit répondre aux règles ACID... Si je me souvient bien
d'accès, il ne répond à presque rien de l'acidité requise !

Moralité comparons les choses comparables !

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************


Via a écrit:
Bonjour à tous !

J'ai écrit un petit programme en VB dans le but de comparer les
rapidités d'Access et SQL Server en insertion.
J'insère donc 10 000 enregistrements dans une table de chacun des deux
systèmes. Je pensais que SQL Server serait au moins équivalent, si ce
n'est plus rapide qu'Access...
Voici mes résultats :

en local :
Access : 0 secondes !!!!!
SQL Server : entre 63 et 68 secondes !

en réseau, avec 4 PC faisant tourner le même programme en même temps
(ils sont synchronisés : le test ne démarre qu'en présence d'un
fichier bien précis sur le réseau et cette présence est testée toutes
les 5 millisecondes avant que le test ne démarre) :
Access : planté sur 2 PC sur les 4 avec une erreur renvoyant un
verrouillage, 6 secondes sur les 2 autres PC,
SQL Server : planté sur 1 PC avec une erreur incompréhensible (une
méthode ~ incorrecte sur un objet ~ !!?), sur les trois autres des
temps qui tournent autour de 125 !!!!

Ces chiffres sont pour moi complètement irréels, surtout le 0 secondes
pour 10 000 boucles d'insertions sur Access. A l'inverse, 125 secondes
sur un réseau certes chargé et sur une table utilisée par trois
programmes, ça me paraît énorme.

Quelqu'un a-t-il un début d'explication à ces résultats délirants ?
Merci d'avance,

Via :)

PS :
Voici le code du programme (du moins de la partie qui nous intéresse)
:

Select Case Test
Case FIN
Unload Me
Exit Sub

Case ACCESS, ACCESS + SQLSERVER

Me.Caption = "Test Access en cours..."

DBEngine.SystemDB = "ServeurCOPTISTestSYS.COR"

Set wEspacedeTravail = DBEngine.CreateWorkspace("Test",
"xxxx", "xxxx")
DBEngine.Workspaces.Append wEspacedeTravail
Set dBaseDeDonnées > DBEngine.Workspaces("Test").OpenDatabase("ServeurCOPTISTestTest.mdb",
False, False)

'Test en ajout
SQL = "SELECT Test FROM Test;"

TDepart = Time

Set RsDAO = dBaseDeDonnées.OpenRecordset(SQL, dbOpenDynaset,
dbConsistent)

For Index = 1 To NbOccurences

RsDAO.AddNew
RsDAO!Test = Index
RsDAO.Update

Next Index

Text1.Text = DateDiff("s", TDepart, Time)

If Test = ACCESS + SQLSERVER Then
Test = SQLSERVER
GoTo Test
End If

Case SQLSERVER

Me.Caption = "Test SQL Server en cours..."

Set ConnexionSQLServer = CreateObject("ADODB.Connection")
ConnexionSQLServer.Open "Provider=SQLOLEDB;Data
Source=Coptis;Initial Catalog=Test;User ID=xxxx;Password=xxxx"

SQL = "SELECT Test FROM Test;"

TDepart = Time

Set RsADO = New ADODB.Recordset
RsADO.CursorLocation = adUseClient
RsADO.Open SQL, ConnexionSQLServer, adOpenDynamic,
adLockOptimistic

For Index = 1 To NbOccurences

RsADO.AddNew
RsADO!Test = Index
RsADO.Update

Next Index

Text2.Text = DateDiff("s", TDepart, Time)

End Select