2013-05-20 40 views
6

我有一個非常簡單的SELECT *查詢與WHERE NOT EXISTS子句。SELECT需要100ms;創建表爲選擇 - 或 - 插入選擇需要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 ASINSERT 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 INDEXUDA_NAME字段二者USER_DEF_ATTRIBUTES(候補鍵)的和TT_SPLDR_55E63A28_59358表。

如果我刪除WHERE NOT EXISTS它需要半秒。


編輯:

如果我使用

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太慢了!


解釋CREATE TABLE與其中NOT EXISTS:(15分鐘)

enter image description here

解釋CREATE TABLE AS與LEFT OUTER JOIN:(500毫秒)

enter image description here


只與WHERE NOT EXISTS解釋SELECT:(100毫秒)

enter image description here

解釋只選擇LEFT OUTER JOIN:(100毫秒)

enter image description here

它似乎在選擇它時會執行相同的操作,但在創建表時,它會爲執行不同的操作和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_NAMEUSER_DEF_ATTRIBUTES上的備用密鑰。

如果我禁用它,並且我在同一個字段上創建一個UNIQUE INDEX,它將運行500毫秒。

無論如何,我不確定這種行爲的原因。