2017-08-11 20 views
0

Oracle查询的性能得到了我下面的查询:如何提高寻找参考表名

SELECT TABLE_NAME, CONSTRAINT_NAME FROM USER_CONSTRAINTS 
WHERE R_OWNER = 'OWNERNAME' AND STATUS ='ENABLED' AND CONSTRAINT_TYPE = 'R' 
AND R_CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM ALL_CONSTRAINTS 
WHERE CONSTRAINT_TYPE IN ('P', 'U') AND TABLE_NAME = 'REGIONS' 
AND OWNER = 'OWNERNAME') 

花了4秒]得到它的输出。

有没有更好的方法来获取参考表名称的名称?

在此先感谢。

+0

为什么在子查询中使用ALL_CONSTRAINTS表? –

+0

这没有理由。如果我使用user_constraints会更好吗? –

+0

我使用user_constraints进行了测试。它需要3秒。我试图找到更好的方式。 –

回答

1

有一个联接条件查询中丢失:

SELECT TABLE_NAME, 
     CONSTRAINT_NAME 
FROM USER_CONSTRAINTS 
WHERE R_OWNER = 'OWNERNAME' 
    AND STATUS ='ENABLED' 
    AND CONSTRAINT_TYPE = 'R' 
    AND (R_OWNER, R_CONSTRAINT_NAME) IN (SELECT OWNER, CONSTRAINT_NAME 
             FROM ALL_CONSTRAINTS 
             WHERE CONSTRAINT_TYPE IN ('P', 'U')  
              AND TABLE_NAME = 'REGIONS' 
              AND OWNER = 'OWNERNAME') 

你不限制R_OWNER为“OWNERNAME”,这是指有看所有约束模式中的OWNERNAME不只有那些链接到OWNERNAME.REGIONS表的链接。

+0

非常感谢fhossfel。 –

+0

我尝试了你的代码,我得到了消息ORA-00947:没有足够的价值。 –

+0

对不起,我已修复它。子选择中缺少OWNER列。 – fhossfel