2017-08-11 40 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