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)
wyjaśniania CREATE tabeli jako lewy OUTER dołączenie: (500 ms)
EXPLAIN dla tylko wybrane z WHERE NOT EXISTS: (100ms)
EXPLAIN dla tylko wybrane z LEFT OUTER JOIN: (100ms)
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
Co mówi ["WYKONUJ"] (http://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm)? –
@BurhanKhalid Zobacz mój wpis powyżej – Teejay
Dodaj plan wyjaśniający dla przypadku LEWEJ ZEWNĘTRZNEJ JOIN. Dzięki. –