oracle 外來鍵無索引導致鎖

2022-06-22 12:03:11 字數 2811 閱讀 1361

摘自tom大師的語句, 外來鍵不加索引

select table_name,

owner constraint_name,

cname1 || nvl2(cname2, ',' || cname2, null) ||

nvl2(cname3, ',' || cname3, null) ||

nvl2(cname4, ',' || cname4, null) ||

nvl2(cname5, ',' || cname5, null) ||

nvl2(cname6, ',' || cname6, null) ||

nvl2(cname7, ',' || cname7, null) ||

nvl2(cname8, ',' || cname8, null) columns

from (select b.owner,

b.table_name,

b.constraint_name,

max(decode(position, 1, column_name, null)) cname1,

max(decode(position, 2, column_name, null)) cname2,

max(decode(position, 3, column_name, null)) cname3,

max(decode(position, 4, column_name, null)) cname4,

max(decode(position, 5, column_name, null)) cname5,

max(decode(position, 6, column_name, null)) cname6,

max(decode(position, 7, column_name, null)) cname7,

max(decode(position, 8, column_name, null)) cname8,

count(*) col_cnt

from (select substr(table_name, 1, 30) table_name,

substr(constraint_name, 1, 30) constraint_name,

substr(column_name, 1, 30) column_name,

position

from dba_cons_columns) a,

dba_constraints b

where a.constraint_name = b.constraint_name

and b.constraint_type = 'r'

group by b.table_name, b.constraint_name, b.owner) cons

where col_cnt > all (select count(*)

from dba_ind_columns i

where i.table_name = cons.table_name

and i.column_name in (cname1,

cname2,

cname3,

cname4,

cname5,

cname6,

cname7,

cname8)

and i.column_position < = cons.col_cnt

group by i.index_name);

--等待事件---p1 p2 p3

select ash .sample_time ,

ash .event ,

ash .session_id ,

ash .blocking_session ,

ash .p1text ,

ash .p1 ,

ash .p2text ,

ash .p2 ,

ash .p3text ,

ash .p3 ,

ash .session_state ,

ash .sql_opname ,

ash .sql_id

--ash.*

from v$active_session_history ash

where ash .sample_time >

to_date ( '20200519 17:50:00' , 'yyyymmdd hh24:mi:ss' )

and ash .sample_time <

to_date ( '20200519 18:10:00' , 'yyyymmdd hh24:mi:ss' )

and ash .wait_class < > 'idle'

-- and ash .event like 'enq: tm - contention'

order by sample_time desc;

--結論 

外來鍵無索引鎖無cascade時,update/delete父表,會在語句級別級聯乙個mode為4的s鎖到子表,其中delete多少行就會級聯多少次

外來鍵無索引有cascade時,update父表仍會在語句級別級聯mode為4的s鎖到子表,delete時會先獲取mode為5的ssx鎖,在將其轉換成mode為3的sx鎖,而且刪除多少行就會涉及到多少次轉換 

外來鍵有索引無cascade時,update/delete不會在語句級級聯鎖到子表,最終會持有父表和子表上的mode為3的sx鎖(無索引時只有有cascade的delete時最終會持有子表上的sx鎖) 

外來鍵有索引有cascade時,與無cascade表現相同

--原文:

mysql建立索引導致鎖表阻塞查詢

慢查詢不一定需要duri資料來源,資料庫自帶相應的記錄表 information schema.processlist show processlist 或者 select from information schema.processlist where command not in sleep ...

Oracle 主鍵外來鍵唯一索引索引

1.查詢索引 select table name,index name from user indexes where table name upper test temp1 2.建立主鍵 1 建立表的時候建立 create table test temp1 id int primary key,n...

Oracle 外來鍵關聯導致資料無法刪除

手動刪除資料庫中冗餘資料可能遇到外來鍵關聯導致資料無法刪除的問題。這個問題的解決及思考記錄如下 問題的產生是因為在資料庫設計的時候,在建立外來鍵關聯的時候沒有設定級聯刪除,也就是說在設定外來鍵的時候並沒有加上on delete cascade限定。對於這個問題,我的想法是 在資料庫設計的時候一般情況...