我有一個非常簡單的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 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
它需要半秒。
編輯:
如果我使用
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分鐘)
解釋CREATE TABLE AS與LEFT OUTER JOIN:(500毫秒)
只與WHERE NOT EXISTS解釋SELECT:(100毫秒)
解釋只選擇LEFT OUTER JOIN:(100毫秒)
它似乎在選擇它時會執行相同的操作,但在創建表時,它會爲執行不同的操作和LEFT OUTER JOIN
是什麼['EXPLAIN'(http://docs.oracle.com/cd/B19306_01/server.102/b14211/ex_plan.htm)說什麼? –
@BurhanKhalid查看我的帖子 – Teejay
請添加LEFT OUTER JOIN案例的解釋計劃。謝謝。 –