2013-05-20 11 views
6

Mam bardzo proste zapytanie SELECT * z klauzulą ​​WHERE NOT EXISTS.SELECT trwa 100ms; UTWÓRZ tabelę jako wybierz - lub - INSERT w select trwa 15 minut

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

To zapytanie około 100 ms, aby wykonać i pobrać < 2000 rekordów.

Jeżeli zapytanie jest zagnieżdżone w CREATE TABLE AS lub w INSERT INTO biegnie w 15 minut.

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

mam UNIQUE INDEX na UDA_NAME pole zarówno USER_DEF_ATTRIBUTES (alternate-Key) i TT_SPLDR_55E63A28_59358 tabele.

Po usunięciu WHERE NOT EXISTS zajmuje to pół sekundy.


EDIT:

Jeśli używam

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 

zamiast WHERE NOT EXISTS biegnie w pół sekundy.

Nie mogę wyjaśnić, dlaczego WHERE NOT EXISTS jest tak wolno!


wyjaśniania CREATE tabeli jako o ile nie jest to istnieje: (15 minut)

enter image description here

wyjaśniania CREATE tabeli jako lewy OUTER dołączenie: (500 ms)

enter image description here


EXPLAIN dla tylko wybrane z WHERE NOT EXISTS: (100ms)

enter image description here

EXPLAIN dla tylko wybrane z LEFT OUTER JOIN: (100ms)

enter image description here

It wydaje się, że po wybraniu tej operacji wykonuje się te same operacje, ale podczas tworzenia tabeli wykonuje inne operacje dla WHERE NOT EXISTS i LEFT OUTER JOIN

+0

Co mówi ["WYKONUJ"] (http://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm)? –

+0

@BurhanKhalid Zobacz mój wpis powyżej – Teejay

+1

Dodaj plan wyjaśniający dla przypadku LEWEJ ZEWNĘTRZNEJ JOIN. Dzięki. –

Odpowiedz

1

Ok, znalazłem to.

To alternatywny klucz na UDA_NAME dla tabeli USER_DEF_ATTRIBUTES.

Jeśli wyłączę to i utworzę UNIQUE INDEX na tym samym polu, działa w 500 milis.

W każdym razie nie jestem pewien co do przyczyny tego zachowania.

Powiązane problemy