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

时间:2013-05-20 10:57:40

标签: 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")

此查询大约需要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 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太慢了!


使用WHERE NOT EXISTS创建表的AS:(15分钟)

enter image description here

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

enter image description here


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

enter image description here

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

enter image description here

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

1 个答案:

答案 0 :(得分:1)

好的,我找到了。

这是表UDA_NAME的{​​{1}}上的备用键。

如果我禁用它并在同一个字段上创建USER_DEF_ATTRIBUTES,它将以500毫秒的速度运行。

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