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

[WD8-9-10] Lenteur HF avec fichier (taille moyenne) en suppression

3 réponses
Avatar
patrice
Bonjour

Je viens de constater une lenteur assez bizarre lors de la suppression
massive d'enregistrement.
J'utilise des fichiers temporaires , lié à un fichier de session.
(chaque fiche temporaire un un champ SESSIONID qui me permet de tout
supprimer quand j'en ai plus besoin)

sess_id=CreateSessionID()
Faire_algo_fichier_tempo(sess_id)
DeleteSessionID(sess_id)

Je me suis apercu de lenteur anormale dans le DeleteSessionID (l'algo durait
30s et la suppression 6minutes!!!)

Apres moult investigations, je m'apercois qu'un truc style :
hlitrecherchepremier(TEMPO,SESSIONID,idsess)
tantque htrouve(TEMPO)
hsupprime(TEMPO)
hlitsuivant(TEMPO)
fin
dure environ 6 minute pour 40000 enregistrement, et n'utilise que 5% du CPU

Alors que :
pour i=1 A hnbenr(TEMPO)
hlit(TEMPO,i)
si TEMPO.SESSIONID=idess alors
hsupprime(TEMPO)
fin
fin

sur le même fichier avec les mêmes données dure 45 secondes

Quelqu'un a t'il déjà observé cela ?
y a t-il un contournement ?

3 réponses

Avatar
Pascal F
Après mure réflexion, patrice a écrit :
Bonjour

Je viens de constater une lenteur assez bizarre lors de la suppression
massive d'enregistrement.
J'utilise des fichiers temporaires , lié à un fichier de session.
(chaque fiche temporaire un un champ SESSIONID qui me permet de tout
supprimer quand j'en ai plus besoin)

sess_id=CreateSessionID()
Faire_algo_fichier_tempo(sess_id)
DeleteSessionID(sess_id)

Je me suis apercu de lenteur anormale dans le DeleteSessionID (l'algo durait
30s et la suppression 6minutes!!!)

Apres moult investigations, je m'apercois qu'un truc style :
hlitrecherchepremier(TEMPO,SESSIONID,idsess)
tantque htrouve(TEMPO)
hsupprime(TEMPO)
hlitsuivant(TEMPO)
fin
dure environ 6 minute pour 40000 enregistrement, et n'utilise que 5% du CPU

Alors que :
pour i=1 A hnbenr(TEMPO)
hlit(TEMPO,i)
si TEMPO.SESSIONID=idess alors
hsupprime(TEMPO)
fin
fin

sur le même fichier avec les mêmes données dure 45 secondes

Quelqu'un a t'il déjà observé cela ?
y a t-il un contournement ?



Pourquoi ne pas passer par une requête du genre:
cReq est une chaine
so_MaSource est une source de données

cReq=[
DELETE FROM TEMPO
WHERE TEMPO.SESSIONID = %1
]

cReq=chaineconstruit(creq,idsess)
SI pas HExecuteRequeteSQL(so_MaSource,hrequetedefaut,cReq) alors
erreur(HErreurInfo())
FIN

--
Pascal

Ne garder que le prénom pour me joindre
Avatar
patrice
"Pascal F" a écrit dans le message de
news:441e6a6a$0$12280$
Pourquoi ne pas passer par une requête du genre:
cReq est une chaine
so_MaSource est une source de données

cReq=[
DELETE FROM TEMPO
WHERE TEMPO.SESSIONID = %1
]




merci pour ta réponse, mais le temps reste comparable (8 sec d'écart entre
les 2 méthodes sur 6minutes)
Avatar
Emmanuel Lecoester
"patrice" a écrit dans le message de
news:441e66a6$0$470$
Bonjour

Je viens de constater une lenteur assez bizarre lors de la suppression
massive d'enregistrement.
J'utilise des fichiers temporaires , lié à un fichier de session.
(chaque fiche temporaire un un champ SESSIONID qui me permet de tout
supprimer quand j'en ai plus besoin)

sess_id=CreateSessionID()
Faire_algo_fichier_tempo(sess_id)
DeleteSessionID(sess_id)

Je me suis apercu de lenteur anormale dans le DeleteSessionID (l'algo


durait
30s et la suppression 6minutes!!!)




Je dirais ...

Apres moult investigations, je m'apercois qu'un truc style :
hlitrecherchepremier(TEMPO,SESSIONID,idsess)
tantque htrouve(TEMPO)
hsupprime(TEMPO)
hlitsuivant(TEMPO)
fin
dure environ 6 minute pour 40000 enregistrement, et n'utilise que 5% du


CPU


Là vous utilisez l'accès à l'index puis au fichier. A chaque suppression on
modifie le fichier sur disque mais aussi l'index ce qui demande une
resynchro vu que l'arbre utilisé est reconstruit si il est déséquilibré). La
faible utilisation CPU vient du fait du temps passé sur l'accès disque.

Alors que :
pour i=1 A hnbenr(TEMPO)
hlit(TEMPO,i)
si TEMPO.SESSIONID=idess alors
hsupprime(TEMPO)
fin
fin
sur le même fichier avec les mêmes données dure 45 secondes




Là vous utilisez directement l'accès au fichier (hlit). Le fichier est
modifié et l'index aussi. Sauf que l'index n'est pas parcouru (pas de
resynchro nécessaire) et vous accéder en direct sur le fichier (pas de
reparcours nécessaire).

Quelqu'un a t'il déjà observé cela ?
y a t-il un contournement ?



Techniques pour les sgbd : Avoir moins d'indexes, désactiver les indexes -
faire les suppression - rebuild des indexes