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")

このクエリは、実行して 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 INDEXonUDA_NAMEフィールドがあります。USER_DEF_ATTRIBUTESTT_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 EXISTS0.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

4

1 に答える 1