2013-05-20 4 views
6

У меня очень простой запрос 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 минут)

enter image description here

EXPLAIN для CREATE TABLE AS с LEFT OUTER JOIN: (500 мс)

enter image description here


EXPLAIN для SELECT, только с WHERE NOT EXISTS: (100мс)

enter image description here

EXPLAIN для SELECT, только с LEFT OUTER JOIN: (100мс)

enter image description here

It кажется, что при выборе он выполняет те же операции, но при создании таблицы он выполняет разные операции для WHERE NOT EXISTS и LEFT OUTER JOIN

+0

Что говорит '' EXPLAIN' '(http://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm)? –

+0

@BurhanKhalid Посмотреть мой пост выше – Teejay

+1

Пожалуйста, добавьте план объяснения для случая LEFT OUTER JOIN. Благодарю. –

ответ

1

Хорошо, я нашел.

Это альтернативный ключ на UDA_NAME для таблицы USER_DEF_ATTRIBUTES.

Если я отключу его, и я создаю UNIQUE INDEX в том же поле, он будет работать в 500 миллисекундах.

В любом случае, я не уверен в причинах такого поведения.

Смежные вопросы