Sie können eine materialisierte Ansicht für diese Abfrage erstellen:
CREATE MATERIALIZED VIEW v_address
REFRESH FORCE ON COMMIT
AS
SELECT address_key
FROM person_address
WHERE person_key IN (person_list)
oder erstellen Sie eine temporäre Tabelle und füllen Sie diese auf:
CREATE GLOBAL TEMPORARY TABLE tt_address (VARCHAR2(50));
INSERT
INTO tt_address
SELECT address_key
FROM person_address
WHERE person_key IN (person_list)
aber wenn Sie wirklich Ihre person_key
ist es in Ordnung, die Unterabfrage wiederzuverwenden.
Da Sie 3
separaten Abfragen, müssen Ihre Werte auf die eine oder andere Weise für sie sichtbar sein.
Das bedeutet, dass Sie diese Werte irgendwo speichern müssen, sei es im Speicher, in einem temporären Tablespace oder in einem permanenten Tablespace.
Aber die Werte, die Sie benötigen, sind bereits in der person_address
müssen Sie sie nur noch abholen.
Verwendung der Unterabfrage 3
Zeiten werden beinhalten 12
Index-Scans zum Abrufen der ROWID
aus dem Index auf person_key
y 12
Tabelle ROWID
Nachschlagewerke zum Abrufen address_key
vom Tisch. Dann wird höchstwahrscheinlich ein HASH TABLE
über ihnen gebaut werden.
Dies ist eine Frage von Mikrosekunden.
Natürlich wäre die temporäre Tabelle oder eine materialisierte Ansicht ein wenig effizienter, aber das Ändern der Unterabfragezeit von 100
Mikrosekunden bis 50
lohnt sich kaum, vorausgesetzt, die wichtigsten Abfragen können Minuten dauern.