1

アプリケーションでOracle11Gを使用しています。

ここに私のデータベースには、8000000のレコードを含むテーブルMST_PRODUCTがあります。

要件に従って、JPAネイティブクエリを使用してテーブルからデータを取得しています。

元 :

     SELECT sku_id
FROM MST_PRODUCT prod
WHERE brand_code IN
  (
   SELECT brand_code
   FROM MST_PRODUCT prod
   WHERE prod.SKU_ID IN
   (SELECT prd_value FROM TRANS_SCH_UNIT_PRD_SCOPE TSUPS WHERE TSUPS.sch_id='600')
  ) and prod.sku_id NOT IN
  (SELECT prd_value
  FROM TRANS_SCH_UNIT_PRD_SCOPE TSUPS
  WHERE TSUPS.sch_id='600'
  );

上記のクエリは、データの取得に時間がかかりすぎます。

表には、約80 00 000SKUIDと500ブランドコードがあります。

このクエリは、実行が完了するまでに50〜60秒かかります。時にはそれ以上。

そして、これが私のテーブルのスキームです...

CREATE TABLE "PERK"."MST_PRODUCT" 
   (    "PRD_ID" NUMBER NOT NULL ENABLE, 
    "COMPANY" VARCHAR2(20 BYTE), 
    "LOB" VARCHAR2(20 BYTE), 
    "PRD_DEPT" VARCHAR2(20 BYTE), 
    "PRD_SUB_DEPT" VARCHAR2(20 BYTE), 
    "CLASS" VARCHAR2(20 BYTE), 
    "SUB_CLASS" VARCHAR2(20 BYTE), 
    "MC_CODE" VARCHAR2(20 BYTE), 
    "BRAND_CODE" VARCHAR2(20 BYTE), 
    "SKU_ID" VARCHAR2(20 BYTE), 
    "MC_DESC" VARCHAR2(20 BYTE), 
    "SKU_DESC" VARCHAR2(40 BYTE), 
    "BRAND_DESC" VARCHAR2(20 BYTE), 
    "MODIFIED_BY" VARCHAR2(30 CHAR), 
    "MODIFIED_DATE" TIMESTAMP (6), 
    "CREATED_BY" VARCHAR2(30 CHAR), 
    "CREATED_DATE" TIMESTAMP (6), 
    "IS_ACTIVE" NUMBER(1,0) DEFAULT 0, 
     CONSTRAINT "MST_PRODUCT_PK" PRIMARY KEY ("PRD_ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS"  ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;


  CREATE INDEX "PERK"."BRAND_INDEX" ON "PERK"."MST_PRODUCT" ("BRAND_CODE") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

  CREATE INDEX "PERK"."CLASS_INDEX" ON "PERK"."MST_PRODUCT" ("CLASS") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

  CREATE INDEX "PERK"."COMP_INDEX" ON "PERK"."MST_PRODUCT" ("COMPANY") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

  CREATE INDEX "PERK"."DEPT_INDEX" ON "PERK"."MST_PRODUCT" ("PRD_DEPT") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

  CREATE INDEX "PERK"."MST_PRD_ISACTIVE_IDX" ON "PERK"."MST_PRODUCT" ("IS_ACTIVE") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

  CREATE INDEX "PERK"."MST_PRD_MCCODE_IDX" ON "PERK"."MST_PRODUCT" ("MC_CODE") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

  CREATE INDEX "PERK"."MST_PRODUCT_INDEX1" ON "PERK"."MST_PRODUCT" ("LOB") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

  CREATE UNIQUE INDEX "PERK"."MST_PRODUCT_PK" ON "PERK"."MST_PRODUCT" ("PRD_ID") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

  CREATE INDEX "PERK"."SKU_INDEX" ON "PERK"."MST_PRODUCT" ("SKU_ID") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

  CREATE INDEX "PERK"."SUBCLASS_INDEX" ON "PERK"."MST_PRODUCT" ("SUB_CLASS") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

  CREATE INDEX "PERK"."SUB_INDEX" ON "PERK"."MST_PRODUCT" ("PRD_SUB_DEPT") 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
  TABLESPACE "USERS" ;

そして、これがクエリの実行プランです...

ここに画像の説明を入力してください

誰かが私を提案できますか、どうすればこのクエリを改善できますか?またはクエリを準備するときに注意する必要がある要素は何ですか?

Reagrds、Gunjan。

4

2 に答える 2

0

あなたはこれを試すことができます:

Select Sku_Id
  From Mst_Product Prod
 Where Exists (Select Null
          From Mst_Product Iprod, Trans_Sch_Unit_Prd_Scope Tsups
         Where Prod.Brand_Code = Iprod.Brand_Code
           And Iprod.Sku_Id = Tsups.Prd_Value
           And Tsups.Sch_Id = '600')
   And Not Exists (Select Null
          From Trans_Sch_Unit_Prd_Scope Tsups
         Where Tsups.Sch_Id = '600'
           And Prod.Sku_Id = Tsups.Prd_Value);
于 2012-12-13T17:15:43.643 に答える
0

サブセレクトの代わりに結合を使用してみます。一般に、副選択は結合よりもパフォーマンスが低下します。

于 2012-12-13T14:28:48.170 に答える