2017-08-11 3 views
0

Ich habe unter Abfrage-Performance von Oracle-Abfrage verbessern:Wie bei der Suche nach Referenztabellennamen

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') 

Es dauerte 4 Sekunden Ausgabe davon zu bekommen.

Gibt es eine bessere Möglichkeit, den Namen des referentiellen Tabellennamens zu erhalten?

Vielen Dank im Voraus.

Joon

+0

Warum verwenden Sie die Tabelle ALL_CONSTRAINTS in der Unterabfrage? –

+0

Es gibt keinen Grund dafür. Es wird besser sein, wenn ich user_constraints benutze? –

+0

Ich habe mit user_constraints getestet. Es dauerte 3 Sekunden statt. Ich versuche, einen besseren Weg zu finden. –

Antwort

1

Es gibt eine Join-Bedingung in der Abfrage fehlt:

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') 

Sie sind nicht R_OWNER zu ‚OWNERNAME‘ zu begrenzen, was bedeutet, dass bei allen Einschränkungen im Schema zu suchen hat OWNERNAME nicht nur diejenigen, die auf die Tabelle OWERNNAME.REGIONS verweisen.

+0

Danke fhossfel eine Menge. –

+0

Ich versuchte mit Ihnen Code und ich bekam die Nachricht ORA-00947: nicht genug Werte. –

+0

Entschuldigung, ich habe es behoben. In der Unterauswahl fehlte die Spalte OWNER. – fhossfel

Verwandte Themen