我有一个非常简单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_ATTRIBUTESTT_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