hi all. WI-V2.5.2.26520
Дано: пустая база с FW = OFF, в которой созданы две таблички:
recreate global temporary table ttmp(id int, s01 varchar(1000)) on commit preserve rows;
recreate table tfix(id int, s01 varchar(1000));
commit;
Сценарий_1.Подключаюсь к этой базе, ввожу 200 тыс строк в обе таблицы и делаю rollback:
+ |
commit; set transaction read committed; set term ^; execute block as declare n int = 200000; declare k int; begin while (n>0) do begin insert into ttmp(id,s01) values(:n, rpad('',1000,'x')); insert into tfix(id,s01) values(:n, rpad('',1000,'x')); n=n-1; end end^ set term ;^ rollback; |
Затем запускаю трейс, и возвращаясь в isql, делаю:
SQL> select count(*) from tfix;
COUNT
============
0
SQL> select count(*) from ttmp;
COUNT
============
0
В трейсе при этом вижу вполне ожидаемые ненулевые backout's
как для TFIX, так и для TTMP:
+ |
select count(*) from tfix
1 records fetched
3336 ms, 3227 read(s), 3225 write(s), 2212906 fetch(es), 409677 mark(s)
Table Natural Index Update Insert Delete Backout Purge Expunge
***************************************************************************************************************
TFIX 200000 ... select count(*) from ttmp
1 records fetched
3749 ms, 3228 read(s), 3225 write(s), 2212906 fetch(es), 409677 mark(s)
Table Natural Index Update Insert Delete Backout Purge Expunge
***************************************************************************************************************
TTMP 200000 |
По этому сценарию вопросов нет, всё понятно.
Сценарий_2. Создаем ситуацию, при которой должен стартовать sweep.
session #1. Также вводим 200 тыс строк:
commit;
set transaction read committed;
set term ^;
execute block as
declare n int = 200000;
declare k int;
begin
while (n>0) do begin
insert into ttmp(id,s01) values(:n, rpad('',1000,'x'));
insert into tfix(id,s01) values(:n, rpad('',1000,'x'));
n=n-1;
end
end^
set term ;^
-- NB: rollback пока не делаем!
session #2 Стартуем 21 тыс автономных транзакций:
commit;
set transaction read committed;
set term ^;
execute block as
declare n int = 21000;
declare k int;
begin
while (n>0) do begin
in autonomous transaction do select 1 from rdb$database into :k;
n=n-1;
end
end^
set term ;^
commit;
session #1rollback;
В результате этих действий gstat -h покажет:
C:\1INSTALL\FIREBIRD\Data>gstat -h T1.FDB
<...>
ODS version 11.2
Oldest transaction 10
Oldest active 11
Oldest snapshot 11
Next transaction 21013
<...>
Sweep interval: 20000
Далее запускаю трейс и в первом isql-окне ввожу:
SQL> select 1 from rdb$database;
CONSTANT
============
1
SQL> select count(*) from tfix;
COUNT
============
0
SQL> select count(*) from ttmp;
COUNT
============
0
В логе трейса после этого вижу:
1) SWEEP_START (строка 112) и его прогресс для всех RDB$-таблиц (строки 132...418) - эти строки появились сразу после ввода "select 1 from rdb$database"
2) SWEEP_FINISH (строка 422) и бравурный итог этого:
Transaction counters:
Oldest interesting 21013
Oldest active 11
Oldest snapshot 11
Next transaction 21015
3202 ms, 3840 read(s), 3238 write(s), 2216343 fetch(es), 409796 mark(s)
(дальше коннект от свипа отсоединяется от базы)
3) нулевое время вып-я для select count(*) from tfix (строка 534)
select count(*) from tfix
1 records fetched
0 ms, 4 fetch(es)
4) НЕнулевое время вып-я для select count(*) from ttmp (это GTT'шка) и ненулевые backout'ы:
+ |
select count(*) from ttmp
1 records fetched
3833 ms, 3227 read(s), 2704 write(s), 2212906 fetch(es), 409677 mark(s)
Table Natural Index Update Insert Delete Backout Purge Expunge
***************************************************************************************************************
TTMP 200000
|
ВОПРОС.Статистика по writes & fetches в сценарии_2 (строка 422) явно совпадает с тем, что было в сценарии_1 для tfix. Где в трейсе вывод работы SWEEP'a по таблице tfix ?
В аттаче - лог трейса для сценария 2.