Bonjour
On commence, enfin, notre migration BDE > DBX… et les performances sont médiocres dans le cas d’INSERT avec paramètres. Donc je me demande si je n’ai pas oublié quelque chose (et j’ai fouillé sur le net…)
Les temps moyens sont 3.19 pour DBX, 0.89 en BDE et 0.90 en ADO, test effectués 20 fois, sur un serveur en réseau et en prod, avec insertion des mêmes données dans les trois cas. DBX serait donc, pour ce cas, 3.6 fois plus lent ?
Une simple requête,de test, avec deux paramètres :
Via le profiler MSSQL, le BDE Remplaçant les paramètres on se retrouve avec cette requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 WITH Query DO // Query BDE, DBX ou ADO BEGIN Prepared:=False; SQL.Text:='SET NOCOUNT ON'; SQL.Add( 'DELETE OF_VAL WHERE NUMERO_OF=:NUMERO_OF'); SQL.Add( ''); SQL.Add( 'INSERT OF_VAL(NUMERO_OF,VALEUR_STOCK_PF)'); SQL.Add( 'VALUES (:NUMERO_OF,:VALEUR_STOCK_PF)'); Prepared:=True; END; Sds_Ligne.First; WHILE NOT Sds_Ligne.EOF DO BEGIN WITH Query DO BEGIN ParamByName('NUMERO_OF').AsString:=Trim(Sds_Ligne.FieldByName('NUMERO_OF').AsString); ParamByName('VALEUR_STOCK_PF').AsCurrency:=Sds_Ligne.FieldByName('VALEUR_STOCK_PF').AsCurrency; ExecSQL; END; Sds_Ligne.Next; end;
en DBX :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SET NOCOUNT ON DELETE OF_VAL WHERE NUMERO_OF='-1019401011' INSERT OF_VAL(NUMERO_OF,VALEUR_STOCK_PF) VALUES ('-1019401011',378.42)
En ADO :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 exec sp_executesql N'SET NOCOUNT ON DELETE OF_VAL WHERE NUMERO_OF= @P1 INSERT OF_VAL(NUMERO_OF,VALEUR_STOCK_PF) VALUES ( @P2 , @P3 ) ',N'@P1 nvarchar(4000),@P2 nvarchar(4000),@P3 float',N'-1031201012',N'-1031201012',201,9906
Malgre le "prepared:=true" DBX s'en tape... et ADO aussi (il ne devrait pas y avoir sp_prepare, sp_execute, sp_execute... et sp_unprepare ?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 declare @p1 int set @p1=2 exec sp_prepexec @p1 output,N'@P1 varchar(11),@P2 varchar(11),@P3 float',N'SET NOCOUNT ON DELETE OF_VAL WHERE NUMERO_OF=@P1 INSERT OF_VAL(NUMERO_OF,VALEUR_STOCK_PF) VALUES (@P2,@P3) ','-1009301011','-1009301011',2069,6028999999999 select @p1 // puis exec sp_unprepare 2
J’ai loupé quelque choses ?
Vu la gestion des paramètres de ADO ( un parambyname(‘x’).As_x :=’x’ ne remplaçant que la première occurrence recherchée) , je suis plus parti pour faire ma propre fonction de remplacement de paramètres…. Mais je voudrais avoir d’autres avis spécialisé
Merci
Partager