2013-05-20 9 views
6

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

verwenden
LEFT 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)

enter image description here

EXPLAIN für TABLE AS mit LEFT OUTER CREATE JOIN: (500 ms)

enter image description here


für SELECT EXPLAIN nur mit WHERE NOT EXISTS: (100ms)

enter image description here

für SELECT EXPLAIN nur mit LEFT OUTER JOIN: (100ms)

enter image description here

Es scheint bei der Auswahl dieselben Operationen auszuführen, aber beim Erstellen der Tabelle werden fürverschiedene Operationen ausgeführtund LEFT OUTER JOIN

+0

Was sagt ['EXPLAIN'] (http://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm)? –

+0

@BurhanKhalid Siehe meinen Beitrag oben – Teejay

+1

Bitte fügen Sie den EXPLAIN-Plan für den LEFT OUTER JOIN-Fall hinzu. Vielen Dank. –

Antwort

1

Ok, ich habe es gefunden.

Es ist der alternative Schlüssel auf UDA_NAME für Tabelle USER_DEF_ATTRIBUTES.

Wenn ich es deaktivieren und ich ein UNIQUE INDEX auf dem gleichen Feld erstellen, wird es in 500 Millis ausgeführt.

Wie auch immer, ich bin mir nicht sicher über den Grund dieses Verhaltens.

Verwandte Themen