FB 2.5.7. Предыстория. С недавних пор у процесса сервера начала заканчиваться память с вот такими сообщениями:
Сегодня поразбирался с этим триггером. Выяснилось, что на тестовой базе апдейт таблицы BAT$RECEIPT$RECEIPT увеличивает потребление памяти процессом сервера со 110 МБ до 1400 МБ и выше (дальше заканчиваются записи для обновления) при выполнении простого запроса:
Методом комментирования нашли строку, при удалении которой сервер перестает потреблять память:
Предполагаю, что FB не освобождает память, если в вычисляемом поле в триггере Before Update используется ХП. В триггере After Update точно такая же проверка, но потребление памяти не увеличивается.
Если описания недостаточно, могу подготовить базу для воспроизведения.
SERVER (Server) Wed Oct 25 19:33:16 2017
Database: -- CENSORED --
unable to allocate memory from operating system
At trigger 'BAT$RECEIPT$RECEIPT_BIU0' line: 6, col: 5
internal Firebird consistency check (error during savepoint backout (290), file: exe.cpp line: 4056)
SERVER (Server) Wed Oct 25 19:35:38 2017
Database: -- CENSORED --
internal Firebird consistency check (can't continue after bugcheck)
SERVER (Server) Wed Oct 25 19:35:38 2017
Database: -- CENSORED --
internal Firebird consistency check (can't continue after bugcheck)
Сегодня поразбирался с этим триггером. Выяснилось, что на тестовой базе апдейт таблицы BAT$RECEIPT$RECEIPT увеличивает потребление памяти процессом сервера со 110 МБ до 1400 МБ и выше (дальше заканчиваются записи для обновления) при выполнении простого запроса:
UPDATE BAT$RECEIPT$RECEIPT R SET ID = ID
Методом комментирования нашли строку, при удалении которой сервер перестает потреблять память:
IF (UPDATING AND (NEW.SERVICES_HINT IS NOT DISTINCT FROM OLD.SERVICES_HINT)) THEN EXIT;Поле "SERVICES_HINT" объявлено следующим образом:
SERVICES_HINT COMPUTED BY ((SELECT RESULT FROM HINT$RECEIPT$SERVICES(BAT$RECEIPT$RECEIPT.ID))),
CREATE OR ALTER PROCEDURE HINT$RECEIPT$SERVICES ( ID_RECEIPT DOM$KEY NOT NULL) RETURNS ( RESULT D_VARCHAR_25000) AS BEGIN ... END
Предполагаю, что FB не освобождает память, если в вычисляемом поле в триггере Before Update используется ХП. В триггере After Update точно такая же проверка, но потребление памяти не увеличивается.
Если описания недостаточно, могу подготовить базу для воспроизведения.