我已经使用自定义应用程序安装了 Oracle 数据库 11g R2。在我的环境中,我们遇到了表锁定。我想检查我的数据库中是否有没有相应索引的外键。是否有任何查询或程序可以查找未编入索引的外键?
Oracle SQL Developer 附带了一个报告来查找这些未编入索引的列。
这是该报告背后的 SQL:
select a.owner "Owner",
a.table_name "Table_Name",
a.constraint_name "Constraint_Name",
a.columns "Foreign_Key_Column_1",
b.columns "Foreign_Key_Column_2",
a.owner sdev_link_owner,
a.table_name sdev_link_name,
'TABLE' sdev_link_type
from
( select a.owner, substr(a.table_name,1,30) table_name,
substr(a.constraint_name,1,30) constraint_name,
max(decode(position, 1, substr(column_name,1,30),NULL)) ||
max(decode(position, 2,', '||substr(column_name,1,30),NULL)) ||
max(decode(position, 3,', '||substr(column_name,1,30),NULL)) ||
max(decode(position, 4,', '||substr(column_name,1,30),NULL)) ||
max(decode(position, 5,', '||substr(column_name,1,30),NULL)) ||
max(decode(position, 6,', '||substr(column_name,1,30),NULL)) ||
max(decode(position, 7,', '||substr(column_name,1,30),NULL)) ||
max(decode(position, 8,', '||substr(column_name,1,30),NULL)) ||
max(decode(position, 9,', '||substr(column_name,1,30),NULL)) ||
max(decode(position,10,', '||substr(column_name,1,30),NULL)) ||
max(decode(position,11,', '||substr(column_name,1,30),NULL)) ||
max(decode(position,12,', '||substr(column_name,1,30),NULL)) ||
max(decode(position,13,', '||substr(column_name,1,30),NULL)) ||
max(decode(position,14,', '||substr(column_name,1,30),NULL)) ||
max(decode(position,15,', '||substr(column_name,1,30),NULL)) ||
max(decode(position,16,', '||substr(column_name,1,30),NULL)) columns
from sys.dba_cons_columns a,
sys.dba_constraints b
where a.constraint_name = b.constraint_name
and a.owner = b.owner
and (:OWNER is null or instr(b.owner, upper(:OWNER))>0)
and b.constraint_type = 'R'
group by a.owner, substr(a.table_name,1,30), substr(a.constraint_name,1,30) ) a,
( select table_owner,
substr(table_name,1,30) table_name, substr(index_name,1,30) index_name,
max(decode(column_position, 1,substr(column_name,1,30),NULL)) ||
max(decode(column_position, 2,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position, 3,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position, 4,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position, 5,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position, 6,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position, 7,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position, 8,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position, 9,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position,10,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position,11,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position,12,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position,13,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position,14,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position,15,', '||substr(column_name,1,30),NULL)) ||
max(decode(column_position,16,', '||substr(column_name,1,30),NULL)) columns
from sys.dba_ind_columns
group by table_owner, substr(table_name,1,30), substr(index_name,1,30) ) b
where a.owner = b.table_owner (+)
and a.table_name = b.table_name (+)
and substr(a.table_name,1,4) != 'BIN$'
and substr(a.table_name,1,3) != 'DR$'
and b.table_name is null
and b.columns (+) like a.columns || '%'
order by a.owner, a.table_name, a.constraint_name
Run Code Online (Sandbox Code Playgroud)
数据库中不存在任何过程,但我们可以创建一个过程来列出所有未索引的外键约束。事实上,如果你用谷歌搜索一下,你会发现很多脚本。
好吧,我有以下查询来获取结果。
SQL> select uc.table_name, uc.constraint_name
from user_constraints uc
where uc.constraint_type='R'
and exists
(select ucc.position, ucc.column_name
from user_cons_columns ucc
where ucc.constraint_name=uc.constraint_name
minus
select uic.column_position as position, uic.column_name
from user_ind_columns uic
where uic.table_name=uc.table_name
);
TABLE_NAME CONSTRAINT_NAME
------------------------------ ------------------------------
DEPARTMENTS DEPT_MGR_FK
COUNTRIES COUNTR_REG_FK
TB_COSTS TB__COST_FK
SQL>
Run Code Online (Sandbox Code Playgroud)
(其中constraint_type='R'表示我们对引用(外键)感兴趣)。
归档时间: |
|
查看次数: |
8044 次 |
最近记录: |