25 июн. 2011 г.

Быстродействие триггера на коммит транзакции

Насколько замедлит выполнение кода наличие триггера на коммит транзакции?

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

Комментариев нет:

Отправить комментарий