У меня очень простой запрос SELECT *
с предложением WHERE NOT EXISTS
.SELECT занимает 100 мс; CREATE table as select - или - INSERT в select возьмите 15 минут
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")
Этот запрос о 100 мс для выполнения и извлечения < 2000 записей.
Если этот запрос вложен в CREATE TABLE AS
или в INSERT INTO
он работает в 15 минут.
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")
)
У меня есть UNIQUE INDEX
на UDA_NAME
поля как USER_DEF_ATTRIBUTES
(альтернативного ключа) и TT_SPLDR_55E63A28_59358
таблицы.
Если я удалю WHERE NOT EXISTS
, потребуется полсекунды.
EDIT:
Если я использую
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
вместо WHERE NOT EXISTS
он работает в полсекунды.
Я не могу объяснить, почему WHERE NOT EXISTS
так медленно!
EXPLAIN для CREATE TABLE AS с WHERE NOT EXISTS: (15 минут)
EXPLAIN для CREATE TABLE AS с LEFT OUTER JOIN: (500 мс)
EXPLAIN для SELECT, только с WHERE NOT EXISTS: (100мс)
EXPLAIN для SELECT, только с LEFT OUTER JOIN: (100мс)
It кажется, что при выборе он выполняет те же операции, но при создании таблицы он выполняет разные операции для WHERE NOT EXISTS
и LEFT OUTER JOIN
Что говорит '' EXPLAIN' '(http://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm)? –
@BurhanKhalid Посмотреть мой пост выше – Teejay
Пожалуйста, добавьте план объяснения для случая LEFT OUTER JOIN. Благодарю. –