Тестовый пример 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 само по себе наличие триггера на коммит транзакции не увеличивает время выполнения кода.
Комментариев нет:
Отправить комментарий