powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB 2.5.3 SC видит index-based план вып-я новой ХП только после переконнекта. Why ?
2 сообщений из 2, страница 1 из 1
FB 2.5.3 SC видит index-based план вып-я новой ХП только после переконнекта. Why ?
    #38733593
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Код: plaintext
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 на строку с переконнектом в этом скрипте).

Стартую трейс с конфигом:
Код: plaintext
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

Стартую в другом окне этот скрипт:
Код: plaintext
isql -q -i pdel.sql

Вижу по итогам выполнения в трейсе:
1. Для первого вызова ХП p_del_sql_in_psql , которая обращается к таблице "обычной" delete-командой внутри своего кода (т.е. не через ES):
Код: plaintext
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:
Код: plaintext
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 (который был уже после переконнекта):
Код: plaintext
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
...
Рейтинг: 0 / 0
FB 2.5.3 SC видит index-based план вып-я новой ХП только после переконнекта. Why ?
    #38733600
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
план ХП (ее внутренностей) создается в момент загрузки ХП в кеш метаданных. В твоем случае это момент создания ХП. На тот момент индекса еще нет. Аминь.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / FB 2.5.3 SC видит index-based план вып-я новой ХП только после переконнекта. Why ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]