Ich habe eine sehr einfache SELECT *
Abfrage mit einer WHERE NOT EXISTS
Klausel.SELECT dauert 100 ms; CREATE Tabelle als Select - oder - INSERT in wählen Sie nehmen 15 Minuten
SELECT *
FROM "BMAN_TP3"."TT_SPLDR_55E63A28_59358" SELECT_TABLE
WHERE NOT EXISTS (SELECT * FROM "BMAN_TP3"."USER_DEF_ATTRIBUTES" EXISTS_TABLE
WHERE "SELECT_TABLE"."UDA_NAME" = "EXISTS_TABLE"."UDA_NAME")
Diese Abfrage etwa 100 ms auszuführen und < 2000 Datensätze zu holen.
Wenn diese Abfrage in einem CREATE TABLE AS
oder in einem INSERT INTO
verschachtelt ist läuft es in 15 Minuten.
CREATE TABLE BMAN_TP3.TT_UDA_TEST TABLESPACE BMAN_TP3_U AS (
SELECT *
FROM "BMAN_TP3"."TT_SPLDR_55E63A28_59358" SELECT_TABLE
WHERE NOT EXISTS (SELECT * FROM "BMAN_TP3"."USER_DEF_ATTRIBUTES" EXISTS_TABLE
WHERE "SELECT_TABLE"."UDA_NAME" = "EXISTS_TABLE"."UDA_NAME")
)
Ich habe ein UNIQUE INDEX
auf UDA_NAME
Bereich der beiden USER_DEF_ATTRIBUTES
(Alternate-Taste) und TT_SPLDR_55E63A28_59358
Tabellen.
Wenn ich die WHERE NOT EXISTS
entferne es dauert eine halbe Sekunde.
EDIT:
Wenn ich
verwendenLEFT OUTER JOIN "BMAN_TP3"."USER_DEF_ATTRIBUTES"
ON "SELECT_TABLE"."UDA_NAME" = "USER_DEF_ATTRIBUTES"."UDA_NAME"
WHERE "USER_DEF_ATTRIBUTES"."UDA_NAME" IS NULL
anstelle des WHERE NOT EXISTS
läuft es in einer halben Sekunde.
Ich kann nicht erklären, warum WHERE NOT EXISTS
so langsam ist!
EXPLAIN für CREATE TABLE AS mit WHERE NICHT EXISTIERT: (15 min)
EXPLAIN für TABLE AS mit LEFT OUTER CREATE JOIN: (500 ms)
für SELECT EXPLAIN nur mit WHERE NOT EXISTS: (100ms)
für SELECT EXPLAIN nur mit LEFT OUTER JOIN: (100ms)
Es scheint bei der Auswahl dieselben Operationen auszuführen, aber beim Erstellen der Tabelle werden fürverschiedene Operationen ausgeführtund LEFT OUTER JOIN
Was sagt ['EXPLAIN'] (http://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm)? –
@BurhanKhalid Siehe meinen Beitrag oben – Teejay
Bitte fügen Sie den EXPLAIN-Plan für den LEFT OUTER JOIN-Fall hinzu. Vielen Dank. –