hi all
Нижеприведенный скрипт создаёт таблицу с двумя полями tmp_01(id int primary key, pid int) и добавляет в неё 300 тыс строк, после чего - создаёт индекс по полю pid.
Кроме того, этот скрипт создает две ХП, каждая из которых удаляет все строки из таблицы с pid = :a_pid.
Первая ХП делает это отдельной командой внутри самой себя: delete from tmp_01 x where x.pid = :a_id;
А вторая - через ES: execute statement ('delete from tmp_01 x where x.pid = :a_id') ( a_id := :a_id );
Затем эти две ХП вызываются: сначала сразу после пересоздания индекса (т.е. до переконнекта), а затем - после переконнекта к этой базе.
Первые два вызова идут с аргументами 51 и 52, вторые два - с арг. 53 и 54.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
set bail on;
create database 'localhost/3253:C:\1INSTALL\FIREBIRD\FB25SNAP\t0.fdb';
show database;
set autoddl on;
commit;
----------------
create or alter procedure p_del_sql_in_psql as begin end;
create or alter procedure p_del_sql_in_es as begin end;
recreate table tmp_01(id int primary key, pid int);
commit;
set term ^;
execute block as
begin
begin execute statement 'create sequence g'; when any do begin end end
end
^
create or alter procedure p_del_sql_in_psql(a_id int) as
declare id int;
declare pid int;
begin
delete from tmp_01 x where x.pid = :a_id;
end
^
create or alter procedure p_del_sql_in_es(a_id int) as
begin
execute statement ('delete from tmp_01 x where x.pid = :a_id') ( a_id := :a_id );
end
^
set term ;^
commit;
alter sequence g restart with 0;
commit;
insert into tmp_01(id, pid) select gen_id(g,1), mod(gen_id(g,0),100)
from rdb$types,rdb$types,(select 1 i from rdb$types rows 10)
rows 300000;
select count(*) from tmp_01;
commit;
create index tmp_01_pid on tmp_01(pid);
commit;
set statistics index tmp_01_pid;
commit;
execute procedure p_del_sql_in_psql( 51 ); -- #1
execute procedure p_del_sql_in_es( 52 ); -- #2
rollback;
connect 'localhost/3253:C:\1INSTALL\FIREBIRD\FB25SNAP\t0.fdb';
execute procedure p_del_sql_in_psql( 53 ); -- #3
execute procedure p_del_sql_in_es( 54 ); -- #4
rollback;
drop database;
quit;
(NB на строку с переконнектом в этом скрипте).
Стартую трейс с конфигом:
1.
2.
3.
4.
5.
6.
7.
8.
log_sweep true
log_context true
time_threshold = 0
log_procedure_finish true
log_statement_finish true
print_plan true
print_perf true
print_blr true
Стартую в другом окне этот скрипт:
Вижу по итогам выполнения в трейсе:
1. Для
первого вызова ХП
p_del_sql_in_psql , которая обращается к таблице "обычной" delete-командой внутри своего кода (т.е.
не через ES):
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
2014-08-31T15:52:29.5310 (520:0223C08C) EXECUTE_STATEMENT_FINISH
C:\1INSTALL\FIREBIRD\FB25SNAP\T0.FDB (ATT_1, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
C:\1INSTALL\FIREBIRD\FB25SNAP\bin\isql.exe:1012
(TRA_25, CONCURRENCY | WAIT | READ_WRITE)
Statement 324:
-------------------------------------------------------------------------------
execute procedure p_del_sql_in_psql ( 51 )
0 records fetched
562 ms, 617020 fetch(es), 3000 mark(s)
Table Natural Index Update Insert Delete Backout
********************************************************************************************
RDB$INDICES 2
RDB$RELATION_CONSTRAINTS 2
TMP_01 300000 3000
2. Для первого вызова ХП
p_del_sql_in_es , которая обращается к таблице через ES:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
2014-08-31T15:52:29.5620 (520:0223C08C) EXECUTE_STATEMENT_FINISH
C:\1INSTALL\FIREBIRD\FB25SNAP\T0.FDB (ATT_1, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
C:\1INSTALL\FIREBIRD\FB25SNAP\bin\isql.exe:1012
(TRA_25, CONCURRENCY | WAIT | READ_WRITE)
Statement 326:
-------------------------------------------------------------------------------
delete from tmp_01 x where x.pid = ?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (X INDEX (TMP_01_PID))
param0 = integer, " 52 "
0 records fetched
23 ms, 15007 fetch(es), 3000 mark(s)
Table Natural Index Update Insert Delete Backout
********************************************************************************************
TMP_01 3000 3000
2014-08-31T15:52:29.5620 (520:0223C08C) EXECUTE_PROCEDURE_FINISH
C:\1INSTALL\FIREBIRD\FB25SNAP\T0.FDB (ATT_1, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
C:\1INSTALL\FIREBIRD\FB25SNAP\bin\isql.exe:1012
(TRA_25, CONCURRENCY | WAIT | READ_WRITE)
Procedure P_DEL_SQL_IN_ES :
param0 = integer, "52"
27 ms
3. Для
второго вызова ХП
p_del_sql_in_psql (который был уже после переконнекта):
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
2014-08-31T15:52:38.7030 (520:0223C08C) EXECUTE_STATEMENT_FINISH
C:\1INSTALL\FIREBIRD\FB25SNAP\T0.FDB (ATT_2, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
C:\1INSTALL\FIREBIRD\FB25SNAP\bin\isql.exe:1012
(TRA_27, CONCURRENCY | WAIT | READ_WRITE)
Statement 43:
-------------------------------------------------------------------------------
execute procedure p_del_sql_in_psql ( 53 )
0 records fetched
71 ms, 3007 read(s), 15021 fetch(es), 3000 mark(s)
Table Natural Index Update Insert Delete Backout
********************************************************************************************
RDB$INDICES 2
RDB$RELATION_CONSTRAINTS 2
TMP_01 3000 3000
Что помешало задействовать индекс tmp_01_pid сразу при первом вызове ХП
p_del_sql_in_psql , т.е. до переконнекта ?
PS.
WI-V2.5.3.26790
Строка запуска службы: fb_inet_server.exe -s FB_253 -m