Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 к азам?  [new]
repeating
Guest
откладываемый внешний ключ: такое впечатление, как будто проверяется, даже если отложен

ключ без каскадностей
alter table SCOTT.CNSTR2 add constraint FK1 foreign key (OBJECT_ID) references SCOTT.CNSTR1 (OBJECT_ID) deferrable

SQL> set constraints all deferred;

Constraint set.

SQL> delete from scott.cnstr1;

131610 rows deleted.


Statistics
----------------------------------------------------------
263 recursive calls
952931 db block gets
1301 consistent gets
7006 physical reads
98622116 redo size
555 bytes sent via SQL*Net to client
544 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
131610 rows processed

SQL> rollback;

Rollback complete.

SQL> alter table scott.cnstr2 disable constraint fk1;

Table altered.

SQL> delete from scott.cnstr1;

131610 rows deleted.


Statistics
------------------------------------------------------
289 recursive calls
152776 db block gets
416 consistent gets
4049 physical reads
50746988 redo size
555 bytes sent via SQL*Net to client
544 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
2 sorts (memory)
0 sorts (disk)
131610 rows processed

10.2.0.1
2 июл 08, 14:09    [5875710]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Можно пояснить, что Вы приводите в качестве подтверждения
repeating
такое впечатление, как будто проверяется, даже если отложен
?

ЗЫ: Чисто ИМХО - вполне вероятно, что многие(если не все) действия по проверке и должны выполняться тогда же, когда обычно, кроме собственно exception
2 июл 08, 14:50    [5876264]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
Timm
Member

Откуда: Moscow, Ё-burg
Сообщений: 3696
Проверяет, зараза.
15:03:45 TIM@test> create table t1 (id int primary key);

Table created.

15:04:19 TIM@test> create table t2 (t1_id int);

Table created.

15:04:40 TIM@test> alter table t2 add constraint t2_fk foreign key (t1_id) references t1 deferrable initially deferred;

Table altered.

15:05:13 TIM@test> insert into t1 select rownum from dual connect by level<=10;

10 rows created.

15:05:29 TIM@test> alter session set sql_trace=true;

Session altered.

15:05:35 TIM@test> delete t1;

10 rows deleted.

15:05:46 TIM@test> disc
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
select /*+ all_rows */ count(1) 
from
 "TIM"."T2" where "T1_ID" = :1


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.00          0          0          0           0
Execute     10      0.01       0.08          0          1          0           0
Fetch       10      0.00       0.00          0         30          0          10
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       21      0.03       0.08          0         31          0          10
2 июл 08, 15:10    [5876489]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
YAP
Member

Откуда: Киев
Сообщений: 2116
и на 11.1 та же фигня

deffered
call     count       cpu    elapsed       disk      query    current        rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 8.21 22.03 1404 862 513387 71437
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 8.21 22.04 1404 862 513387 71437

disabled
call     count       cpu    elapsed       disk      query    current        rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 1 0.00 0.00 0 0 0 0
Execute 1 2.93 9.69 1087 174 81259 71437
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 2 2.93 9.69 1087 174 81259 71437
2 июл 08, 15:19    [5876572]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
YAP
Member

Откуда: Киев
Сообщений: 2116
в 11.1 не нашел рекурсивных стейтментов по проверке внешнего ключа, но вот такое нашел

PARSING IN CURSOR #47 len=29 dep=0 uid=5 oct=7 lid=5 tim=1582876878979 hv=3458640848 ad='1f98c344' sqlid='g0tugs372dayh'
delete from scott.t1 deff
END OF STMT
PARSE #47:c=15625,e=365857,p=8,cr=38,cu=0,mis=1,r=0,dep=0,og=1,tim=1582876878969

*** 2008-07-02 14:15:42.531
WAIT #47: nam='db file sequential read' ela= 39885 file#=4 block#=75420 blocks=1 obj#=77979 tim=1582876919143
WAIT #47: nam='db file sequential read' ela= 60330 file#=3 block#=856 blocks=1 obj#=0 tim=1582876990766
...
WAIT #47: nam='db file sequential read' ela= 39138 file#=4 block#=75506 blocks=1 obj#=77979 tim=1582879221895
WAIT #47: nam='db file sequential read' ela= 35385 file#=4 block#=77867 blocks=1 obj#=77982 tim=1582879263109


SQL> select owner,segment_name,segment_type from dba_extents
  2  where FILE_ID=4 and &a1 between BLOCK_ID and BLOCK_ID+BLOCKS-1;

Enter value for a1: 75506

OWNER
------------------------------
SEGMENT_NAME
--------------------------------------------------------------------------------
SEGMENT_TYPE
------------------
SCOTT
T1
TABLE

SQL> /
Enter value for a1: 77867

OWNER
------------------------------
SEGMENT_NAME
--------------------------------------------------------------------------------
SEGMENT_TYPE
------------------
SCOTT
IDX2
INDEX
а это и есть индекс на поле внешнего ключа
create index scott.idx2 on scott.t2(object_id);
2 июл 08, 15:36    [5876691]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
YAP
Member

Откуда: Киев
Сообщений: 2116
надо полагать такова реализация, правило проверяется в процессе исполнения стейтмента, откладывается только выдача сообщения об ошибке.

собственно, а как же иначе...


PARSING IN CURSOR #25 len=29 dep=0 uid=5 oct=90 lid=5 tim=1584800068722 hv=3826303847 ad='1f970230' sqlid='8y9xr23k11hv7'
set constraints all immediate
END OF STMT
PARSE #25:c=0,e=537,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1584800068714
WAIT #25: nam='db file sequential read' ela= 12020 file#=201 block#=15883 blocks=1 obj#=173 tim=1584800080929
=====================
PARSING IN CURSOR #6 len=80 dep=1 uid=0 oct=3 lid=0 tim=1584800081969 hv=1395529870 ad='15b588a0' sqlid='dwwbq1j9kw64f'
select o.name, c.name from con$ c, user$ o where c.con# = :1 and owner# = user#
END OF STMT
PARSE #6:c=0,e=888,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=1584800081960
EXEC #6:c=15625,e=2467,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=1584800084621
WAIT #6: nam='db file sequential read' ela= 14177 file#=1 block#=346 blocks=1 obj#=173 tim=1584800098963
WAIT #6: nam='db file sequential read' ela= 8597 file#=1 block#=102642 blocks=1 obj#=173 tim=1584800107699
WAIT #6: nam='db file sequential read' ela= 9380 file#=1 block#=86637 blocks=1 obj#=173 tim=1584800117181
WAIT #6: nam='db file sequential read' ela= 11364 file#=1 block#=93 blocks=1 obj#=173 tim=1584800128680
FETCH #6:c=0,e=44046,p=4,cr=5,cu=0,mis=0,r=1,dep=1,og=4,tim=1584800128776
STAT #6 id=1 cnt=1 pid=0 pos=1 obj=0 op='NESTED LOOPS (cr=5 pr=4 pw=4 time=0 us cost=3 size=41 card=1)'
STAT #6 id=2 cnt=1 pid=1 pos=1 obj=28 op='TABLE ACCESS BY INDEX ROWID CON$ (cr=3 pr=3 pw=3 time=0 us cost=2 size=24 card=1)'
STAT #6 id=3 cnt=1 pid=2 pos=1 obj=52 op='INDEX UNIQUE SCAN I_CON2 (cr=2 pr=2 pw=2 time=0 us cost=1 size=0 card=1)'
STAT #6 id=4 cnt=1 pid=1 pos=2 obj=22 op='TABLE ACCESS CLUSTER USER$ (cr=2 pr=1 pw=1 time=0 us cost=1 size=17 card=1)'
STAT #6 id=5 cnt=1 pid=4 pos=1 obj=11 op='INDEX UNIQUE SCAN I_USER# (cr=1 pr=0 pw=0 time=0 us cost=0 size=0 card=1)'

*** 2008-07-02 14:47:45.515
EXEC #25:c=31250,e=61081,p=5,cr=5,cu=2,mis=0,r=0,dep=0,og=1,tim=1584800129903
ERROR #25:err=2292 tim=158461110
2 июл 08, 15:54    [5876848]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
YAP
надо полагать такова реализация, правило проверяется в процессе исполнения стейтмента, откладывается только выдача сообщения об ошибке.

Нелогичная какая-то реализация... ведь исключения может и не возникнуть при фиксации транзакции, на то она и отложенная проверка, чтобы дочерние записи раньше родительской можно было вставить. Т.е. если откладывать (кэшировать что ли?) сообщения об ошибках, то надо еще потом пробежаться по списку отложенных, чтоб лишние поудалять... :)
2 июл 08, 16:20    [5877133]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
YAP
Member

Откуда: Киев
Сообщений: 2116
последний кусок трейса показывает что при проверке констрейнта идет обращение в темповый сегмент (файл 201) и вычитка имени констрейнта для сообщения об ошибке.

вижу то что вижу.

вставка родительских записей видимо тоже не просто так делается...

а прикиньне, в транзакции с отложенными правилами фигачится тысячи стейтментов, которые чего-нить нарушают, ежели делать проверку потом, это ж нужно какую очередь заданий на проверку сварганить, найти заново эти данные, проверить, видимо все таки дешевле проверять сразу.
2 июл 08, 16:25    [5877180]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Apex
Нелогичная какая-то реализация... ведь исключения может и не возникнуть при фиксации транзакции, на то она и отложенная проверка, чтобы дочерние записи раньше родительской можно было вставить. Т.е. если откладывать (кэшировать что ли?) сообщения об ошибках, то надо еще потом пробежаться по списку отложенных, чтоб лишние поудалять... :)
ИМХО как раз достаточно логичная, по крайней мере с точки зрения программиста :) А то, что в конце надо перепроверить - не так уж много, имея данные на руках :)
2 июл 08, 16:34    [5877260]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
Elic
Member

Откуда:
Сообщений: 29980
YAP
надо полагать такова реализация, правило проверяется в процессе исполнения стейтмента, откладывается только выдача сообщения об ошибке.

собственно, а как же иначе...
Что-то в этом есть, но не всё так просто:
SQL> create table tmp_parent(id int primary key);

Table created.

SQL> create table tmp_child(id int references tmp_parent deferrable initially deferred);

Table created.

SQL> 
SQL> insert into tmp_child values(1);

1 row created.

SQL> insert into tmp_parent values(1);

1 row created.

SQL> commit;

Commit complete.

SQL> 
SQL> insert into tmp_child values(2);

1 row created.

SQL> declare
SQL>   pragma autonomous_transaction;
SQL> begin
SQL>   insert into tmp_parent values(2);
SQL>   commit;
SQL> end;
SQL> /

PL/SQL procedure successfully completed.

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02291: integrity constraint (OWNER_SOU.SYS_C005345) violated - parent key not found
YAP
а прикиньне, в транзакции с отложенными правилами фигачится тысячи стейтментов, которые чего-нить нарушают, ежели делать проверку потом, это ж нужно какую очередь заданий на проверку сварганить, найти заново эти данные, проверить, видимо все таки дешевле проверять сразу.
Jannny
ИМХО как раз достаточно логичная, по крайней мере с точки зрения программиста :) А то, что в конце надо перепроверить - не так уж много, имея данные на руках :)
Но в таком случае надо вести список ошибок, который надо подчищать в зависимости от последующих действий транзакции. Совсем не уверен, что такая подчистка будет проще. IMHO.
2 июл 08, 16:50    [5877437]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
YAP
Member

Откуда: Киев
Сообщений: 2116
Elic
Но в таком случае надо вести список ошибок, который надо подчищать в зависимости от последующих действий транзакции. Совсем не уверен, что такая подчистка будет проще. IMHO.


из Вашего примера следует, что подчистка ошибок идет в контексте той же транзакции, где ошибки сделаны, в контексте другой транзакции незакоммиченные данные не видны, и видимо поэтому и подчистка невозможна.
2 июл 08, 16:56    [5877491]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Elic
Но в таком случае надо вести список ошибок, который надо подчищать в зависимости от последующих действий транзакции. Совсем не уверен, что такая подчистка будет проще. IMHO.
Ну да, вести в том или ином виде. Но мне кажется, что задним числом заново поднять все, что было "натворено" в транзакции, гораздо сложнее. А тут в конце у нас есть типа список ошибок, которые по имеющимся данным надо перепроверить :)
2 июл 08, 17:01    [5877520]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
Elic
Member

Откуда:
Сообщений: 29980
Jannny
А тут в конце у нас есть типа список ошибок, которые по имеющимся данным надо перепроверить :)
Вот так перепроверяет (ли?):
insert into tmp_parent values(4);
commit;
declare
  pragma autonomous_transaction;
begin
  delete tmp_parent where id = 4;
  commit;
end;
/
insert into tmp_child values(4);
commit;

ORA-02091: transaction rolled back
ORA-02291: integrity constraint (OWNER_AGROSTL.SYS_C002405) violated - parent key not found
А как я раньше показал - нет. Несимметричность поведения какая-то :)
2 июл 08, 17:31    [5877746]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Elic
Jannny
А тут в конце у нас есть типа список ошибок, которые по имеющимся данным надо перепроверить :)
Вот так перепроверяет (ли?):

А как я раньше показал - нет. Несимметричность поведения какая-то :)
Ну так ИМХО как раз не противоречит - есть список ошибок на перепроверку, есть знания этой транзакции об изменениях. На основании их и перепроверяет :)
2 июл 08, 17:32    [5877755]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
YAP
Member

Откуда: Киев
Сообщений: 2116
дык жешь
create table tmp_child(id int references tmp_parent deferrable initially deferred);

все закономерно
2 июл 08, 17:34    [5877774]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Jannny
Elic
Jannny
А тут в конце у нас есть типа список ошибок, которые по имеющимся данным надо перепроверить :)
Вот так перепроверяет (ли?):

А как я раньше показал - нет. Несимметричность поведения какая-то :)
Ну так ИМХО как раз не противоречит - есть список ошибок на перепроверку, есть знания этой транзакции об изменениях. На основании их и перепроверяет :)
Пардон, это я не досмотрела пример :) Действительно не очень симметрично, видать критичные (для ошибок) места ещё как-то отчитываются :)
2 июл 08, 17:46    [5877876]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
stax..
Guest
Jannny

Пардон, это я не досмотрела пример :) Действительно не очень симметрично, видать критичные (для ошибок) места ещё как-то отчитываются :)

имхо
сложно сделать семетрично
рестарта по коммиту ж нет
зы
правда я не знаю как они борятся с
инсертом и делитом
мож для каждой записи при делите (инсерте) снимают флажок
не наю
думаю что всетаки "перечитывают" блоки при коммите
деферед сложная штука для программера
найди попробуй слет коммита
мало кто проверяет
2 июл 08, 22:35    [5878706]     Ответить | Цитировать Сообщить модератору
 Re: к азам?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
до кучи - про отложенные чеки см.
Сейчас попробовал это на 11gr1 - всё то же самое..
3 июл 08, 13:26    [5881171]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить