找出oracle沒有建立索引的外來鍵

2021-07-03 20:52:14 字數 3763 閱讀 5423

外來鍵列沒有索引,容易導致enq: tm - contention等待事件,所以外來鍵列必須建立索引。

(1)下面的sql語句可以定位出哪些外來鍵約束沒有建立索引。

select table_name, 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.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 user_cons_columns) a, 

user_constraints b 

where a.constraint_name = b.constraint_name 

and b.constraint_type = 'r' 

group by b.table_name, b.constraint_name) cons 

where col_cnt > 

all (select   count (*) 

from user_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) 

/  (2)批量給沒有索引的外來鍵列建立索引

select 'create index ind_fk_'||table_name||' on '||table_name||' ('||columns||') online nologging;' from (

select table_name, 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.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 user_cons_columns) a, 

user_constraints b 

where a.constraint_name = b.constraint_name 

and b.constraint_type = 'r' 

group by b.table_name, b.constraint_name) cons 

where col_cnt > 

all (select   count (*) 

from user_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) 

)

oracle 建立索引

要在oracle資料庫中使用索引,首先需要建立oracle索引。下面就為您介紹建立oracle索引的方法,希望對您能有所幫助。適當的使用索引可以提高資料檢索速度,可以給經常需要進行查詢的字段建立索引。oracle的索引分為5種 唯一索引,組合索引,反向鍵索引,位圖索引,基於函式的索引 建立oracl...

oracle建立索引

create recreate indexes 建立索引 一張表上建立多個索引,一般是該錶的資料量大,建立索引能夠提高資料庫的select效能。一般是在要select的字段建立索引。oracle建立索引語法 create index indexname on tablename colum crea...

oracle建立索引

建立乙個使用者 set sqlprompt user create user jsx identified by 123 建立使用者jsx grant all privileges to jsx 給使用者授權 conn jsx 123 建立books表 create table books book...