[XE3, MSSQL, DBExpress] Performance INSERT avec paramètres
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 :
Code:
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; |
Via le profiler MSSQL, le BDE Remplaçant les paramètres on se retrouve avec cette requête :
Code:
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 DBX :
Code:
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 |
En ADO :
Code:
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 |
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 ?)
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