Hola movorack.
Cita:
Empezado por movorack
Tengo una pequeña duda con respecto a la eficiencia de ejecución de las consultas paramétricas vs consultas estáticas.
|
Lo dicho por
Casimiro y
duilioisola, usar parámetros es superior en todos los aspectos.
Cita:
Empezado por movorack
Si! eso es lo que siempre he manejado pero tengo un compañero algo terco que y no he hallado la respuesta técnica para terminar de convencerlo.
|
Para muestra basta un botón... Que pruebe este ejemplo con solo dos columnas:
Código Delphi
[-]
const
NO_ROWS = 100000;
var
Freq, Start, Stop: Int64;
procedure TForm1.FormCreate(Sender: TObject);
begin
Memo1.Font.Name:= 'Currier';
QueryPerformanceFrequency(Freq);
end;
procedure TForm1.btnStaticClick(Sender: TObject);
var
i: Integer;
tt: Double;
begin
with IBQuery1 do
begin
Close;
SQL.Text:= 'DELETE FROM TEST';
ExecSQL;
QueryPerformanceCounter(Start);
Close;
for i:= 1 to NO_ROWS do
begin
SQL.Clear;
SQL.Add('INSERT INTO TEST(ID,NOMBRE)');
SQL.Add('VALUES('+QuotedStr(IntToStr(i))+', '+
QuotedStr('Nombre '+IntToStr(i))+')');
end;
ExecSQL;
end;
QueryPerformanceCounter(Stop);
tt:= (Stop-Start)*1000000 div Freq;
Memo1.Lines.Add(Format('Estatico : %s ms.',[FormatFloat('0,', tt)]));
end;
procedure TForm1.ParameterClick(Sender: TObject);
var
i: Integer;
tt: Double;
begin
with IBQuery1 do
begin
Close;
SQL.Text:= 'DELETE FROM TEST';
ExecSQL;
QueryPerformanceCounter(Start);
Close;
SQL.Clear;
SQL.Add('INSERT INTO TEST(ID,NOMBRE)');
SQL.Add('VALUES(:ID,:NOMBRE)');
Prepare;
for i:= 1 to NO_ROWS do
begin
ParamByName('ID').AsInteger:= i;
ParamByName('NOMBRE').AsString:= Format('Nombre %d',[i]);
end;
ExecSQL;
end;
QueryPerformanceCounter(Stop);
tt:= (Stop-Start)*1000000 div Freq;
Memo1.Lines.Add(Format('Parametrizado: %s ms.',[FormatFloat('0,', tt)]));
end;
En mi caso obtuve estos resultados:
Código:
Estatico : 665.696 ms.
Parametrizado: 135.562 ms.
Saludos