句を含む非常に単純な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")
このクエリは、実行して 2000 件未満のレコードを取得するのに約 100 ミリ秒かかります。
このクエリがCREATE TABLE AS
または にネストされている場合、 15 分INSERT INTO
で実行されます。
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
onUDA_NAME
フィールドがあります。USER_DEF_ATTRIBUTES
TT_SPLDR_55E63A28_59358
を削除するWHERE NOT EXISTS
と、0.5 秒かかります。
編集 :
私が使用する場合
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
0.5 秒で実行されます。
なぜWHERE NOT EXISTS
こんなに遅いのか説明できません!
CREATE TABLE AS with WHERE NOT EXISTS の EXPLAIN : (15 分)
EXPLAIN for CREATE TABLE AS with LEFT OUTER JOIN : (500 ミリ秒)
EXPLAIN for SELECT only with WHERE NOT EXISTS : (100ms)
EXPLAIN for SELECT only with LEFT OUTER JOIN : (100ms)
選択するときは同じ操作をするようですが、テーブルを作成するときは と に対して異なる操作をWHERE NOT EXISTS
行いますLEFT OUTER JOIN