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

[SQLite] Temps d'accès

10 réponses
Avatar
Roumegou
Bonjour,

Je rencontre des temps de réponses décevants avec SQLite.

Pour le code suivant (doit ramener 4000 lignes de 55 colonnes), cela me
prend plus de 4 mn de chargement.
Sur les conseils de Firetox, j'ai mis cela dans une transaction. J'ai
donc rajouté fSQL:mysqltransaction(fSQL:mysqldebut,lCurreq) et
fSQL:mysqltransaction(fSQL:mysqlfin,lCurreq) pour redescendre à 2 mn
30.
Le meme traitement avec oracle4wd et mysql4wd prend environ 35
secondes.(avec ou sans transaction)
J'attendais pourtant des résultats plus rapides avec SQLite ???
Je vais tester sur une autre machine pour en avoir le coeur net mais si
vous avez des suggestions.

lCurreq=0
fSQL:mySQLSetMode(2) //début mode fetch
fSQL:mysqltransaction(fSQL:mysqldebut,lCurreq)
SI PAS fSQL:mySQLExec(Commande,lCurreq) ALORS
fSQL:mySQLMsgBox("Erreur sur requete "+RC+Commande)
fSQL:mySQLFerme(lCurreq)
RENVOYER Faux
SINON
TableAjoute(Matable)
pI=TableOccurrence(Matable)
NumCol=0
NumCol++;PPL_ID[pI]=fSQL:mySQLLitCol(lCurreq,NumCol) //Id Participant
NumCol++;LVL_ID[pI]=fSQL:mySQLLitCol(lCurreq,NumCol) //Niveau
[CUT]
NumCol++;tOPE_ID[pI]=fSQL:mySQLLitCol(lCurreq,NumCol) //Code
opération

FIN //TANTQUE fSQL:mySQLFetch(lCurReq)

FIN
fSQL:mySQLSetMode(1) //fin mode fetch
fSQL:mySQLFerme(lCurreq)
fSQL:mysqltransaction(fSQL:mysqlfin,lCurreq)

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)

10 réponses

Avatar
Gégé
> Je rencontre des temps de réponses décevants avec SQLite.
Pour le code suivant (doit ramener 4000 lignes de 55 colonnes), cela me
prend plus de 4 mn de chargement.
Le meme traitement avec oracle4wd et mysql4wd prend environ 35
secondes.(avec ou sans transaction)



Les index sont-ils identiques ?
Avatar
Firetox
Bonjour, eric

exemple de SQLite sur une table avec 1000 enreg
chargement dans la transaction 88 centieme de seconde

4000 ligne
chargement : 3 seconde 20

sur un p4 3 ghz

ca depend beaucoup de la machine et de la ram
normal, car a ce moment la ce n'est plus le serveur qui en a besoin mais le
client
si ton serveur est rapide Oracle, MySQL le seron
si ta machine ram Oracle, MySQL ne ramerons pas mais SQLite oui
comprends tu la difference ?

bon dev
@+


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

Bonjour,

Je rencontre des temps de réponses décevants avec SQLite.

Pour le code suivant (doit ramener 4000 lignes de 55 colonnes), cela me
prend plus de 4 mn de chargement.
Sur les conseils de Firetox, j'ai mis cela dans une transaction. J'ai
donc rajouté fSQL:mysqltransaction(fSQL:mysqldebut,lCurreq) et
fSQL:mysqltransaction(fSQL:mysqlfin,lCurreq) pour redescendre à 2 mn
30.
Le meme traitement avec oracle4wd et mysql4wd prend environ 35
secondes.(avec ou sans transaction)
J'attendais pourtant des résultats plus rapides avec SQLite ???
Je vais tester sur une autre machine pour en avoir le coeur net mais si
vous avez des suggestions.

lCurreq=0
fSQL:mySQLSetMode(2) //début mode fetch
fSQL:mysqltransaction(fSQL:mysqldebut,lCurreq)
SI PAS fSQL:mySQLExec(Commande,lCurreq) ALORS
fSQL:mySQLMsgBox("Erreur sur requete "+RC+Commande)
fSQL:mySQLFerme(lCurreq)
RENVOYER Faux
SINON
TableAjoute(Matable)
pI=TableOccurrence(Matable)
NumCol=0
NumCol++;PPL_ID[pI]=fSQL:mySQLLitCol(lCurreq,NumCol) //Id Participant
NumCol++;LVL_ID[pI]=fSQL:mySQLLitCol(lCurreq,NumCol) //Niveau
[CUT]
NumCol++;tOPE_ID[pI]=fSQL:mySQLLitCol(lCurreq,NumCol) //Code
opération

FIN //TANTQUE fSQL:mySQLFetch(lCurReq)

FIN
fSQL:mySQLSetMode(1) //fin mode fetch
fSQL:mySQLFerme(lCurreq)
fSQL:mysqltransaction(fSQL:mysqlfin,lCurreq)

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)



Avatar
Roumegou
Gégé avait soumis l'idée :
Je rencontre des temps de réponses décevants avec SQLite.
Pour le code suivant (doit ramener 4000 lignes de 55 colonnes), cela me
prend plus de 4 mn de chargement.
Le meme traitement avec oracle4wd et mysql4wd prend environ 35
secondes.(avec ou sans transaction)



Les index sont-ils identiques ?



Oui !
mais à ce propos si l'on suit les comparatifs, SQLite se passerait
mieux des index (par rapport à mySQL et PostGreSQL) car les temps pour
ses select ne sont guere dégradés alors que les insert, update en
pâtissent.

Mais je continuerai à créer les index sous SQLite; mon but étant
d'avoir les memes modèles d'un SGBD à l'autre.

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou
Après mure réflexion, Firetox a écrit :
Bonjour, eric

exemple de SQLite sur une table avec 1000 enreg
chargement dans la transaction 88 centieme de seconde

4000 ligne
chargement : 3 seconde 20

sur un p4 3 ghz

ca depend beaucoup de la machine et de la ram
normal, car a ce moment la ce n'est plus le serveur qui en a besoin mais le
client
si ton serveur est rapide Oracle, MySQL le seront



Pour mySQL, mon serveur Linux est bien. Par contre, pour Oracle 9i, ce
meme serveur est un peu court avec ses 256 MO de ram (mais il s'en tire
honorablement)

si ta machine ram Oracle, MySQL ne ramerons pas mais SQLite oui
comprends tu la difference ?



Bien sûr; mais comparons ce qui est comparable :
Je viens de tout mettre sur mon portable (Celeron 2,7 Ghz Ram 768 Mo
Ram) et le traitement prend 1mn 3sec sur SQLite (que la base soit sur
le portable ou sur le réseau) contre 18 sec pour Oracle4wd (le nouveau
mode fetch de manu ;-) ) , 35 sec pour l'accès Oracle Pcsoft, 28 sec
pour mySQL4wd, 30 sec pour l'accès mysql pcsoft.

Donc meme avec une machine correcte (l'autre était un Duron 1ghz
512MO), les temps ne parlent pas pour SQLite.

Peut-être serait-il plus à l'aise en programmation sqlpremier,
sqlsuivant ?



bon dev
@+




--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou
Roumegou avait écrit le 29/04/2004 :

Peut-être serait-il plus à l'aise en programmation sqlpremier, sqlsuivant ?



Il était interressant d'en avoir le coeur net, donc j'ai reprogrammé le
chargement de ma table :

AND THE WINNER IS ...

SQLite4wd 1mn 3sec en sqlfetch 29 sec en sqlpremier
mySQL4WD 28 sec en sqlfetch 17 sec en sqlpremier
Oracle4wd 18 sec en sqlfetch 20 sec en sqlpremier
Oracle Pcsoft 35 sec en sqlfetch 34 sec en sqlpremier

Je ne voudrais pas cafter mais c'est Manu qui m'a ré-orienté vers le
sqlfetch alors que j'utilisais plutôt le sqlpremier,sqlsuivant. On
comprends pourquoi! lol

Plus sérieusement, il faudrait peut être creuser sur la différence du
simple au double pour SQLite.




bon dev
@+





--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Daniel
Bonsoir,

va voir ce lien il y a une peut être une voie d'explication.

http://www.sqlite.org/speed.html

sur le premier test tu remarqueras, qd mode synchrone sqlite est très
lent. Le problème que j'ai un doute sur l'interprétation de ce test, c' est que
le test a été fait sur une machine Linux,
et que par défaut si on utilise une fat Reiser ou Ext3 on est en mode
asynchrone...

Grosso modo, en mode synchrone dès que tu fais une écriture disque tu
mets à jours la table d'allocation de ta partition, en mode asynchrone
c'est un peu comme si on travaille en mode transactionnel sur mysql,
la mise à jour de la table d'allocation est faite uniquement lorsque
la transaction est validée (donc plus rapide)

Pour windows par défaut sous 2000, et 2000 server tu es en mode
asynchrone (à confirmer par les spécialistes).

Lorsque tu fais la petite manip nécessaire pour ne pas avoir des
problèmes d'index sous HF (manip dans BdR) tu mets windows en mode
synchrone (donc plus lent pour tout ce qui est les éctitures...)

C'est peut être pour ces raisons que sqlite sur ta machine est plus
lent, enfin ce n'est qu'une voie de réflexion.

Une autre voie, je crois que tu peux configurer la taille d'un espace
mémoire sous sqlite... enfin là il faut aller voir la doc sur le
site...

[HS]
Concernant Windows et les autres version de windows je ne connais
pas. J'ai uniquement besoin de windows pour Windev.
[fin HS]


Roumegou writes:

Après mure réflexion, Firetox a écrit :
> Bonjour, eric
>
> exemple de SQLite sur une table avec 1000 enreg
> chargement dans la transaction 88 centieme de seconde
>
> 4000 ligne
> chargement : 3 seconde 20
>
> sur un p4 3 ghz
>
> ca depend beaucoup de la machine et de la ram
> normal, car a ce moment la ce n'est plus le serveur qui en a besoin mai s le
> client
> si ton serveur est rapide Oracle, MySQL le seront

Pour mySQL, mon serveur Linux est bien. Par contre, pour Oracle 9i, ce
meme serveur est un peu court avec ses 256 MO de ram (mais il s'en
tire honorablement)

> si ta machine ram Oracle, MySQL ne ramerons pas mais SQLite oui
> comprends tu la difference ?

Bien sûr; mais comparons ce qui est comparable :
Je viens de tout mettre sur mon portable (Celeron 2,7 Ghz Ram 768 Mo
Ram) et le traitement prend 1mn 3sec sur SQLite (que la base soit sur
le portable ou sur le réseau) contre 18 sec pour Oracle4wd (le nouveau
mode fetch de manu ;-) ) , 35 sec pour l'accès Oracle Pcsoft, 28 sec
pour mySQL4wd, 30 sec pour l'accès mysql pcsoft.

Donc meme avec une machine correcte (l'autre était un Duron 1ghz
512MO), les temps ne parlent pas pour SQLite.

Peut-être serait-il plus à l'aise en programmation sqlpremier,
sqlsuivant ?


>
> bon dev
> @+
>

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)




--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)
Avatar
Roumegou
Daniel vient de nous annoncer :
Bonsoir,

va voir ce lien il y a une peut être une voie d'explication.

http://www.sqlite.org/speed.html



Oui je l'ai consulté bien sûr. C'est notamment là qu'ils comparent
SQLite avec mySQL et PostGreSQL.
C'est là aussi que l'on constate que les index sont très importants
dans le cas de mySQL et PostGreSQL et moins pour SQLite.


sur le premier test tu remarqueras, qd mode synchrone sqlite est très
lent. Le problème que j'ai un doute sur l'interprétation de ce test, c'est
que le test a été fait sur une machine Linux,
et que par défaut si on utilise une fat Reiser ou Ext3 on est en mode
asynchrone...

Grosso modo, en mode synchrone dès que tu fais une écriture disque tu
mets à jours la table d'allocation de ta partition, en mode asynchrone
c'est un peu comme si on travaille en mode transactionnel sur mysql,
la mise à jour de la table d'allocation est faite uniquement lorsque
la transaction est validée (donc plus rapide)

Pour windows par défaut sous 2000, et 2000 server tu es en mode
asynchrone (à confirmer par les spécialistes).



Mon SQLite est sur XP. Mes bases Oracle et mySQL sont sur linux.


Lorsque tu fais la petite manip nécessaire pour ne pas avoir des
problèmes d'index sous HF (manip dans BdR) tu mets windows en mode
synchrone (donc plus lent pour tout ce qui est les éctitures...)

C'est peut être pour ces raisons que sqlite sur ta machine est plus
lent, enfin ce n'est qu'une voie de réflexion.

Une autre voie, je crois que tu peux configurer la taille d'un espace
mémoire sous sqlite... enfin là il faut aller voir la doc sur le
site...

[HS]
Concernant Windows et les autres version de windows je ne connais
pas. J'ai uniquement besoin de windows pour Windev.
[fin HS]


Roumegou writes:

Après mure réflexion, Firetox a écrit :
Bonjour, eric

exemple de SQLite sur une table avec 1000 enreg
chargement dans la transaction 88 centieme de seconde

4000 ligne
chargement : 3 seconde 20

sur un p4 3 ghz

ca depend beaucoup de la machine et de la ram
normal, car a ce moment la ce n'est plus le serveur qui en a besoin mais le
client
si ton serveur est rapide Oracle, MySQL le seront



Pour mySQL, mon serveur Linux est bien. Par contre, pour Oracle 9i, ce
meme serveur est un peu court avec ses 256 MO de ram (mais il s'en
tire honorablement)

si ta machine ram Oracle, MySQL ne ramerons pas mais SQLite oui
comprends tu la difference ?



Bien sûr; mais comparons ce qui est comparable :
Je viens de tout mettre sur mon portable (Celeron 2,7 Ghz Ram 768 Mo
Ram) et le traitement prend 1mn 3sec sur SQLite (que la base soit sur
le portable ou sur le réseau) contre 18 sec pour Oracle4wd (le nouveau
mode fetch de manu ;-) ) , 35 sec pour l'accès Oracle Pcsoft, 28 sec
pour mySQL4wd, 30 sec pour l'accès mysql pcsoft.

Donc meme avec une machine correcte (l'autre était un Duron 1ghz
512MO), les temps ne parlent pas pour SQLite.

Peut-être serait-il plus à l'aise en programmation sqlpremier,
sqlsuivant ?



bon dev
@+




--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)






--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou
Roumegou a émis l'idée suivante :
Daniel vient de nous annoncer :
Bonsoir,

va voir ce lien il y a une peut être une voie d'explication.

http://www.sqlite.org/speed.html



sur le premier test tu remarqueras, qd mode synchrone sqlite est très
lent. Le problème que j'ai un doute sur l'interprétation de ce test, c'est
que le test a été fait sur une machine Linux,
et que par défaut si on utilise une fat Reiser ou Ext3 on est en mode
asynchrone...





Il y a des paramètres sur la base à ce sujet auxquels on peut accéder
avec l'outil SQLite Database Browser
Il y a notamment le mode SYNCHRONOUS qui est par défaut à 1.

En le passant à 0, j'ai gagné une vingtaine de secondes sur mon pc
"poussif" mais rien sur mon pc plus performant.

En doublant la taille du cache size (par def 2000, mis à 4000); cela a
allongé les temps (1mn contre 26 sec) sur mon pc performant ???

Voilà l'état de mes tests.

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Firetox
Bonjour, eric

pour le SQLFetch je pense pouvoir te donner des elements de reponse :

difference entre fetch et SQLpremier (ou MySQLTable)

le fetch execute une commande SQLite dans la dll pour chaque ligne
le MySQLTable je recupere toutes les données avec 1 seule instruction SQLite
et je met ca dans des tableaux dynamiques en C++

le fetch sera plus rapide pour des tables ayant un nombre de lignes
important

bon dev@+


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

Roumegou a émis l'idée suivante :
> Daniel vient de nous annoncer :
>> Bonsoir,
>>
>> va voir ce lien il y a une peut être une voie d'explication.
>>
>> http://www.sqlite.org/speed.html
>
>> sur le premier test tu remarqueras, qd mode synchrone sqlite est très
>> lent. Le problème que j'ai un doute sur l'interprétation de ce test,


c'est
>> que le test a été fait sur une machine Linux,
>> et que par défaut si on utilise une fat Reiser ou Ext3 on est en mode
>> asynchrone...

Il y a des paramètres sur la base à ce sujet auxquels on peut accéder
avec l'outil SQLite Database Browser
Il y a notamment le mode SYNCHRONOUS qui est par défaut à 1.

En le passant à 0, j'ai gagné une vingtaine de secondes sur mon pc
"poussif" mais rien sur mon pc plus performant.

En doublant la taille du cache size (par def 2000, mis à 4000); cela a
allongé les temps (1mn contre 26 sec) sur mon pc performant ???

Voilà l'état de mes tests.

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)



Avatar
Daniel
Bonjour,

ok. J'ai vu ta réponse sur sqlpremier et fetch.

De mon coté dès que j'ai le temps je fais un test de vitesse entre
sqlite et mysql. J'ai déjà un projet qui travaille sur les 2 bases,
mais j'utilise sqlite uniquement pour les nouveaux insert ou update...



Roumegou writes:

Roumegou a émis l'idée suivante :
> Daniel vient de nous annoncer :
>> Bonsoir,
>>
>> va voir ce lien il y a une peut être une voie d'explication.
>>
>> http://www.sqlite.org/speed.html
>
>> sur le premier test tu remarqueras, qd mode synchrone sqlite est très
>> lent. Le problème que j'ai un doute sur l'interprétation de ce
>> test, c'est que le test a été fait sur une machine Linux,
>> et que par défaut si on utilise une fat Reiser ou Ext3 on est en mode
>> asynchrone...

Il y a des paramètres sur la base à ce sujet auxquels on peut accéd er
avec l'outil SQLite Database Browser
Il y a notamment le mode SYNCHRONOUS qui est par défaut à 1.

En le passant à 0, j'ai gagné une vingtaine de secondes sur mon pc
"poussif" mais rien sur mon pc plus performant.

En doublant la taille du cache size (par def 2000, mis à 4000); cela a
allongé les temps (1mn contre 26 sec) sur mon pc performant ???

Voilà l'état de mes tests.

--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)




--
suivre ce lien pour répondre:
http://cerbermail.com/?2KrV3YZXnn
Daniel
;-)