powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / On delete cascade: "встроенный" триггер (check_NN) медленнее простой эмуляции каскада.Why?
5 сообщений из 5, страница 1 из 1
On delete cascade: "встроенный" триггер (check_NN) медленнее простой эмуляции каскада.Why?
    #38701435
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all:

DDL-1 : две таблицы, дочерняя связана с родительской по FK on delete cascade:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
recreate table tdetl(id int primary key using index tdetl_pk, pid int);
recreate table tmain(id int primary key using index tmain_pk);
alter table tdetl add constraint tdetl_fk foreign key (pid)
references tmain(id) on delete cascade
using index tdetl_pid;
commit;
insert into tmain values(1);
set term ^;
execute block as
declare variable n int = 500000;
begin
  while (n>0) do insert into tdetl(id, pid) values(:n-1, 1) returning :n-1 into n;
end^
set term ;^
commit;
DDL-2 : те же две таблицы, но связи PK-FK нету, а каскадное удаление обеспечивается after_detele-триггером на родительской таблице:
Код: 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.
set term ^;
execute block as
begin
  begin
  execute statement 'drop trigger tmain_ad';
  when any do begin end
  end
end
^
set term ;^
commit;

recreate table tdetl(id int primary key using index tdetl_pk, pid int);
recreate table tmain(id int primary key using index tmain_pk);
commit;
 create index tdetl_pid on tdetl(pid); 
commit;

insert into tmain values(1);
set term ^;
execute block as
declare variable n int = 300000;
begin
  while (n>0) do insert into tdetl(id, pid) values(:n-1, 1) returning :n-1 into n;
end
^
set term ;^
commit;

set term ^;
create  trigger tmain_ad  for tmain
active after delete position 0
as
begin
  delete from tdetl d where d.pid = old.id; -- попрёт по индексу tdetl_pid, как и FK + каскад
end
^
set term ;^
commit;
Выполняю в обоих вариантах одно и тоже:
Код: plaintext
SQL> delete from tmain where id=1;

Для варианта-1 (с FK + on delete cascade) вижу:
15558 ms, ..., 3501230 fetch(es)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
2014-07-21T00:00:21.1870 (424:0233BFD0) EXECUTE_STATEMENT_FINISH
        C:\1INSTALL\FIREBIRD\FB25SNAP\T0.FDB (ATT_5, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        C:\1INSTALL\FIREBIRD\FB25SNAP\bin\isql.exe:1396
                (TRA_30, CONCURRENCY | WAIT | READ_WRITE)

Statement 39:
-------------------------------------------------------------------------------
delete from tmain where id=1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (TMAIN INDEX (TMAIN_PK))
0 records fetched
  15558 ms, 14529 read(s), 6668 write(s), 3501230 fetch(es), 500001 mark(s)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
RDB$INDICES                                       7
RDB$RELATION_CONSTRAINTS               10
TDETL                                        500000                        500000
TMAIN                                             1                             1
Для варианта-2 (с простым AD-триггером на родительской таблице) вижу:
13894 ms, ..., 2500627 fetch(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.
30.
31.
2014-07-21T00:05:17.5310 (424:0233BFD0) EXECUTE_TRIGGER_FINISH
        C:\1INSTALL\FIREBIRD\FB25SNAP\T0.FDB (ATT_5, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        C:\1INSTALL\FIREBIRD\FB25SNAP\bin\isql.exe:1396
                (TRA_35, CONCURRENCY | WAIT | READ_WRITE)
        TMAIN_AD FOR TMAIN (AFTER DELETE)
  13876 ms, 7261 read(s), 6418 write(s), 2500603 fetch(es), 500000 mark(s)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
RDB$INDICES                                       2
RDB$RELATION_CONSTRAINTS                4
TDETL                                        500000                        500000

2014-07-21T00:05:17.5460 (424:0233BFD0) EXECUTE_STATEMENT_FINISH
        C:\1INSTALL\FIREBIRD\FB25SNAP\T0.FDB (ATT_5, SYSDBA:NONE, NONE, TCPv4:127.0.0.1)
        C:\1INSTALL\FIREBIRD\FB25SNAP\bin\isql.exe:1396
                (TRA_35, CONCURRENCY | WAIT | READ_WRITE)

Statement 35:
-------------------------------------------------------------------------------
delete from tmain where id=1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (TMAIN INDEX (TMAIN_PK))
0 records fetched
  13894 ms, 7270 read(s), 6426 write(s), 2500627 fetch(es), 500001 mark(s)

Table                             Natural     Index    Update    Insert    Delete   Backout     Purge   Expunge
***************************************************************************************************************
RDB$INDICES                                       3
RDB$RELATION_CONSTRAINTS                8
TDETL                                        500000                        500000
TMAIN                                             1                             1

Чем объяснить дифферент в 1 млн фетч, и к тому же - не впользу "встроенного" триггера, обеспечивающего FK ?
...
Рейтинг: 0 / 0
On delete cascade: "встроенный" триггер (check_NN) медленнее простой эмуляции каскада.Why?
    #38701450
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, надо в первую очередь не фетчи сравнивать, а чтения.
Во-вторых, сравнивать надо таки одинаковые количества записей,
а не 300 тыщ и 500 тыщ. Если в реале были одинаковые, и это ты
при копировании сюда напортачил - ну тогда уже думать, что там
не так и куда ещё лям утекает. Если он и есть - ну, видимо, где-то
неоптимально используется индекс, например, по 2 фетча на запись.
...
Рейтинг: 0 / 0
On delete cascade: "встроенный" триггер (check_NN) медленнее простой эмуляции каскада.Why?
    #38701455
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамВо-первых, надо в первую очередь не фетчи сравнивать, а чтения.не, погодь! чтения могут варьироваться туда-сюда в зав. от р-ра страничного кеша. При повторном запуске их может вообще не оказаться. Я потому и смотрю именно на фетчи.

Гаджимурадов РустамВо-вторых, сравнивать надо таки одинаковые количества записей,
а не 300 тыщ и 500 тыщ. Если в реале были одинаковые, и это ты
при копировании сюда напортачилда, косяк при копипасте: сначала делал 50 тыс, затем 300, затем 500 - вот и забыл привести в соотв-вие статистику и ДДЛ; но в трейсе и так видно, что фигачилось именно 500 тыс :)
...
Рейтинг: 0 / 0
On delete cascade: "встроенный" триггер (check_NN) медленнее простой эмуляции каскада.Why?
    #38701497
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторил на LI-T3.0.0.31228 (SS, cache = 512K, FW = OFF), сделав несколько раз заливку и грохание 1 млн строк в TDETL.
Результат - "еще более" тот же, что и на 2.5.

Для варианта-1 (с FK + on delete cascade):
~2860 ms, 7002438 fetch(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.
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.
2014-07-21T08:15:01.7610 (22259:0x7f9788f761f8) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/tmp30.fdb (ATT_14, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:4516
                (TRA_22, CONCURRENCY | WAIT | READ_WRITE)

Statement 181:
-------------------------------------------------------------------------------
delete from tmain where id=1
0 records fetched
   2861 ms, 7002438 fetch(es), 1000001 mark(s)

Table                             Natural     Index    Update    Insert    Delete
**********************************************************************************
RDB$INDICES                                       3
RDB$RELATION_CONSTRAINTS                          1
TDETL                                       1000000                       1000000
TMAIN                                             1                             1

. . .

2014-07-21T08:15:38.4980 (22259:0x7f9788f73ce8) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/tmp30.fdb (ATT_17, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:1972
                (TRA_26, CONCURRENCY | WAIT | READ_WRITE)

Statement 181:
-------------------------------------------------------------------------------
delete from tmain where id=1
0 records fetched
   2859 ms, 7002438 fetch(es), 1000001 mark(s)

Table                             Natural     Index    Update    Insert    Delete
**********************************************************************************
RDB$INDICES                                       3
RDB$RELATION_CONSTRAINTS                          1
TDETL                                       1000000                       1000000
TMAIN                                             1                             1

. . .

2014-07-21T08:16:09.2660 (22259:0x7f9788f761f8) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/tmp30.fdb (ATT_20, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:1972
                (TRA_30, CONCURRENCY | WAIT | READ_WRITE)

Statement 181:
-------------------------------------------------------------------------------
delete from tmain where id=1
0 records fetched
   2860 ms, 7002438 fetch(es), 1000001 mark(s)

Table                             Natural     Index    Update    Insert    Delete
**********************************************************************************
RDB$INDICES                                       3
RDB$RELATION_CONSTRAINTS                          1
TDETL                                       1000000                       1000000
TMAIN                                             1                             1

Для варианта-2 (с AD-триггером) :
~2480 ms, 5001248 fetch(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.
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.
2014-07-21T08:16:44.8640 (22259:0x7f9788f73ce8) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/tmp30.fdb (ATT_23, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:1972
                (TRA_37, CONCURRENCY | WAIT | READ_WRITE)

Statement 171:
-------------------------------------------------------------------------------
delete from tmain where id=1
0 records fetched
   2484 ms, 5001248 fetch(es), 1000001 mark(s)

Table                             Natural     Index    Update    Insert    Delete
**********************************************************************************
RDB$INDICES                                       6
RDB$RELATION_CONSTRAINTS                          2
TDETL                                       1000000                       1000000
TMAIN                                             1                             1

. . .

2014-07-21T08:17:40.9330 (22259:0x7f9788f761f8) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/tmp30.fdb (ATT_26, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:4716
                (TRA_44, CONCURRENCY | WAIT | READ_WRITE)

Statement 173:
-------------------------------------------------------------------------------
delete from tmain where id=1
0 records fetched
   2476 ms, 5001248 fetch(es), 1000001 mark(s)

Table                             Natural     Index    Update    Insert    Delete
***********************************************************************************
RDB$INDICES                                       6
RDB$RELATION_CONSTRAINTS                          2
TDETL                                       1000000                       1000000
TMAIN                                             1                             1

. . .

2014-07-21T08:18:15.6560 (22259:0x7f9788f73ce8) EXECUTE_STATEMENT_FINISH
        /var/db/fb30/tmp30.fdb (ATT_29, SYSDBA:NONE, NONE, TCPv4:192.168.43.96)
        C:\MIX\firebird\fb25\bin\isql.exe:4716
                (TRA_51, CONCURRENCY | WAIT | READ_WRITE)

Statement 173:
-------------------------------------------------------------------------------
delete from tmain where id=1
0 records fetched
   2478 ms, 5001248 fetch(es), 1000001 mark(s)

Table                             Natural     Index    Update    Insert    Delete
***********************************************************************************
RDB$INDICES                                       6
RDB$RELATION_CONSTRAINTS                          2
TDETL                                       1000000                       1000000
TMAIN                                             1                             1
Т.е. на каждую строку в дочерней таблице (при её удалении) FK+CASCADE дополнительно делает 2 фетча.
...
Рейтинг: 0 / 0
On delete cascade: "встроенный" триггер (check_NN) медленнее простой эмуляции каскада.Why?
    #38701501
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗЫ. А еще непонятно, почему в трейсе не показываются факты срабатывания CHECK_NN триггера, который отслеживает FK.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / On delete cascade: "встроенный" триггер (check_NN) медленнее простой эмуляции каскада.Why?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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