6

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

4

1 回答 1

1

好的,我找到了。

UDA_NAME这是table上的备用键USER_DEF_ATTRIBUTES

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

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

于 2013-05-20T15:52:22.723 回答