SQL Firebird.
Есть некий запрос к БД, который должен периодически выполняться в разных транзакциях. После выполнния должен быть сразу Commit.
Как в теории правильнее сделать запрос - с параметрами или без?
Я сделал два тестовых примера:
С парметрами:
- Код: Выделить всё
q.SQL.Clear;
q.ParamCheck:=True;
q.SQL.Add('EXECUTE PROCEDURE UpdateNum(:pTp, :pNum)');
//q.Transaction.StartTransaction
For i:=0 to 1000 do begin
If not q.Prepared then
q.Prepare;
q.Params[0].AsInteger:=75;
q.Params[1].AsInteger:=i;
q.ExecSQL;
//q.Close;
(q.Transaction as TSQLTransaction).Commit;
end;
и без:
- Код: Выделить всё
q.ParamCheck:=false;
//q.Transaction.StartTransaction
For i:=0 to 1000 do begin
q.SQL.Clear;
q.SQL.Add('EXECUTE PROCEDURE UpdateNum('+IntToStr(75)+','+IntToStr(i)+')');
q.ExecSQL;
q.Close;
(q.Transaction as TSQLTransaction).Commit;
end;
Скорость обоих примеров получилась одинаковой.
В первом примере q.Prepare выполняется для каждой итерации.
В разных просторах инета писалось, что Prepare ускоряет работу.
Выходит, на единичных запросах использование параметров не дает никакой выгоды?
Или все же существует какая-то возможность держать подготовленным запрос при закрытой транзакции?
Добавлено спустя 21 минуту 36 секунд:
Добавлю.
В реальном проекте транзакция периодически идет с параметром 'concurrency', а иногда - 'consistency'.