Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all articles
Browse latest Browse all 1677

Огромное потребление памяти в FB 2.5

$
0
0
FB 2.5.7. Предыстория. С недавних пор у процесса сервера начала заканчиваться память с вот такими сообщениями:
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 точно такая же проверка, но потребление памяти не увеличивается.
Если описания недостаточно, могу подготовить базу для воспроизведения.

Viewing all articles
Browse latest Browse all 1677

Trending Articles