Tabela USER prawdopodobnie zawiera wiele kluczy obcych, które się do niej odnoszą. Jeśli którykolwiek z nich nie jest indeksowany, Oracle zablokuje całą tabelę podrzędną, usuwając wiersz z tabeli nadrzędnej. Jeśli wiele instrukcji zostanie uruchomionych w tym samym czasie, nawet dla innego użytkownika, te same tabele podrzędne zostaną zablokowane. Ponieważ nie można kontrolować kolejności tych operacji rekurencyjnych, możliwe jest, że wiele sesji zablokuje te same zasoby w innej kolejności, powodując zakleszczenie.
Zobacz tę sekcję w podręczniku Concepts, aby uzyskać więcej informacji.
Aby rozwiązać ten problem, dodaj indeksy do wszystkich nieindeksowanych kluczy obcych. Jeśli nazwy kolumn są standardowe, taki skrypt może pomóc w znalezieniu potencjalnych kandydatów:
--Find un-indexed foreign keys.
--
--Foreign keys.
select owner, table_name
from dba_constraints
where r_constraint_name = 'USER_ID_PK'
and r_owner = 'THE_SCHEMA_NAME'
minus
--Tables with an index on the relevant column.
select table_owner, table_name
from dba_ind_columns
where column_name = 'USER_ID';