Sometimes we got cases when the Firebird process consumes a lot of RAM.
Here are 3 main reasons why it happens. Please note - these are NOT recommendations :) Please don't run them on the production!
DefaultDbCachePages = 500000M # pages
isql -user SYSDBA -pass masterkey localhost:e:\temp\blob30.fdb
Statement failed, SQLSTATE = HY001
unable to allocate memory from operating system
-IProvider::attachDatabase failed when loading mapping cache
Use CONNECT or CREATE DATABASE to specify a database
SQL>
create generator g1;
set generator g1 to 0;
execute block
as
declare variable blb BLOB;
declare variable icnt integer;
begin
icnt=0;
while (icnt <100000000) DO
begin
select cast('1234567890qwertyuiopasdfghjklzxcvbnm' as BLOB) from rdb$database into :blb;
select gen_id(g1,1) from rdb$database into :icnt;
end
end;
create or alter procedure BLOB_LOOP returns ( ATEXT blob sub_type text )
as begin
while (true) do begin
atext = '123';
suspend;
end
end
select count(*) from blob_loop
C:\FB\30Cs>echo set list on; set stat on; select mon$page_buffers from mon$database; | isql -c 98765 /:e30 -user foo -pas bar
Database: /:e30, User: FOO
SQL>
MON$PAGE_BUFFERS 98765
Current memory = 869314176
Delta memory = 75760
Max memory = 869334512
Elapsed time= 0.001 sec
Buffers = 98765
Reads = 3
Writes = 0
Fetches = 42
SQL>
======
set bail on;
set term ^;
execute block as
declare n int = 10;
declare c int;
declare my_password varchar(20) = 'bar';
begin
while (n>0) do
begin
execute statement 'select 1 from rdb$database'
on external 'localhost:' || rdb$get_context('SYSTEM', 'DB_NAME')
as user current_user password my_password
role lpad('', 20, replace(uuid_to_char(gen_uuid()),'-',''))
into c;
n = n - 1;
end
end
^
set term ;^
set list on;
select count(distinct(t.mon$attachment_id)) as num_of_attachments, sum(t.mon$memory_used) as sum_memo_used, sum(t.mon$memory_allocated) as sum_memo_allocated
from (
select
a.mon$attachment_id
,m.*
from mon$attachments a
join mon$memory_usage m on a.mon$stat_id = m.mon$stat_id
where mon$user = current_user
) t;
=======