我有一个非常简单SELECT *
的带有WHERE NOT EXISTS
子句的查询。
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 条记录。
如果此查询嵌套在 aCREATE TABLE AS
或 a 中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 AS with WHERE NOT EXISTS : (15 分钟)
解释 CREATE TABLE AS with LEFT OUTER JOIN : (500 ms)
仅使用 WHERE NOT EXISTS 解释 SELECT : (100ms)
EXPLAIN for SELECT only with LEFT OUTER JOIN : (100ms)
似乎在选择它时会执行相同的操作,但是在创建表时它会执行不同的WHERE NOT EXISTS
操作LEFT OUTER JOIN