Тестовый пример 10 000 раз извлекает имя контакта с идентификатором 650 001.
EXECUTE BLOCK
AS
DECLARE VARIABLE I INTEGER = 0;
DECLARE VARIABLE S VARCHAR(60);
BEGIN
WHILE (:I < 10000) DO
BEGIN
EXECUTE STATEMENT
'SELECT name FROM gd_contact WHERE id=650001'
WITH COMMON TRANSACTION
INTO :S;
I = :I + 1;
END
END
На общей транзакции время выполнения у нас составило 367 мс.
Теперь повторим тоже самое, но каждый селект будет выполняться на своей, автономной транзакции:
EXECUTE BLOCK
AS
DECLARE VARIABLE I INTEGER = 0;
DECLARE VARIABLE S VARCHAR(60);
BEGIN
WHILE (:I < 10000) DO
BEGIN
EXECUTE STATEMENT
'SELECT name FROM gd_contact WHERE id=650001'
WITH AUTONOMOUS TRANSACTION
INTO :S;
I = :I + 1;
END
END
Время выполнения составило 13 000 мс. Как видно, 10 000 стартов и коммитов транзакции не даются нам даром.
Создадим пустой триггер на коммит транзакции:
CREATE OR ALTER TRIGGER tc_test ACTIVE ON TRANSACTION COMMIT POSITION 9000 AS BEGIN ENDВремя выполнения с таким триггером также составляет 13 000 мс. Для сравнения добавим в триггер операторы:
CREATE OR ALTER TRIGGER tc_test
ACTIVE
ON TRANSACTION COMMIT
POSITION 9000
AS
DECLARE VARIABLE S VARCHAR(255);
BEGIN
S = RDB$GET_CONTEXT('USER_TRANSACTION', 'TEST');
IF (:S IS NULL) THEN
BEGIN
S = 'A';
END
ENDВремя выполнения увеличилось на 700 мс (по 0.7 мс в расчете на одну итерацию).
Вывод: Для Firebird 2.5 само по себе наличие триггера на коммит транзакции не увеличивает время выполнения кода.
Комментариев нет:
Отправить комментарий