SELECT需要100ms; CREATE表作为select - 或 - INSERT into select需要15分钟

Tee*_*jay 6 oracle

我有一个非常简单的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")
Run Code Online (Sandbox Code Playgroud)

此查询执行大约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")
)
Run Code Online (Sandbox Code Playgroud)

我有一个UNIQUE INDEXon (交替键)和表的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
Run Code Online (Sandbox Code Playgroud)

而不是WHERE NOT EXISTS它在半秒内运行.

我无法解释为什么WHERE NOT EXISTS这么慢!


在没有安装的情况下解析创建表:(15分钟)

在此输入图像描述

使用LEFT OUTER JOIN对CREATE TABLE AS进行EXPLAIN:(500 ms)

在此输入图像描述


仅使用WHERE NOT EXISTS的EXPLAIN for SELECT:(100ms)

在此输入图像描述

仅使用LEFT OUTER JOIN的EXPLAIN for SELECT:(100ms)

在此输入图像描述

似乎在选择它时会进行相同的操作,但在创建表时,它会对WHERE NOT EXISTS和执行不同的操作LEFT OUTER JOIN

Tee*_*jay 1

好的,我找到了。

UDA_NAME这是table 的备用键USER_DEF_ATTRIBUTES

UNIQUE INDEX如果我禁用它并在同一字段上创建一个,它的运行时间为 500 毫秒。

无论如何,我不确定这种行为的原因。