2017-05-27 13 views
2

終了までに時間がかかる重要な文を最適化することを望んでいました。optimizeマイナス・オラクルで問合せを挿入

基本的に処理する:

1)5を挿入、一つ一つによってNG_ORGANIZATION_CATEGORY_GTMPにデータを挿入します。これらのDMLは、クエリごとに10秒かかることがあります。 (この表は約414K行を持っている)だけで、テーブルの上にNG_ORGANIZATION_CATEGORY約6行を挿入、

Insert 1 - 292770 
Insert 2 - 106648 
Insert 3 - 67358 
Insert 4 - 47775 
Insert 5 - 6147 

2)問題のあるクエリの実行:最後のトレースからは、これらのDMLは、行の下の数を挿入します。

INSERT INTO NG_ORGANIZATION_CATEGORY(ORGANIZATION_ID,CATEGORY_CODE,ADDED_DATE) 
    SELECT ORGANIZATION_ID,CATEGORY_CODE,:B1 AS ADDED_DATE 
    FROM NG_ORGANIZATION_CATEGORY_GTMP 
    WHERE (ORGANIZATION_ID,CATEGORY_CODE) IN (
      SELECT ORGANIZATION_ID,CATEGORY_CODE 
      FROM NG_ORGANIZATION_CATEGORY_GTMP 
      MINUS 
      SELECT ORGANIZATION_ID,CATEGORY_CODE 
      FROM NG_ORGANIZATION_CATEGORY); 

3)NG_ORGANIZATION_CATEGORYテーブルからデータを削除します。それだけでなく、大丈夫です。以下は

DELETE FROM NG_ORGANIZATION_CATEGORY 
WHERE 
(ORGANIZATION_ID,CATEGORY_CODE) IN (SELECT ORGANIZATION_ID,CATEGORY_CODE 
    FROM NG_ORGANIZATION_CATEGORY MINUS SELECT ORGANIZATION_ID,CATEGORY_CODE 
    FROM NG_ORGANIZATION_CATEGORY_GTMP); 

問題の挿入のためのトレースです:

SQL ID: gwxs083gcfdd2 Plan Hash: 2436575860 

INSERT INTO NG_ORGANIZATION_CATEGORY(ORGANIZATION_ID,CATEGORY_CODE,ADDED_DATE) 
    SELECT ORGANIZATION_ID,CATEGORY_CODE,:B1 AS ADDED_DATE FROM 
    NG_ORGANIZATION_CATEGORY_GTMP WHERE (ORGANIZATION_ID,CATEGORY_CODE) IN (
    SELECT ORGANIZATION_ID,CATEGORY_CODE FROM NG_ORGANIZATION_CATEGORY_GTMP 
    MINUS SELECT ORGANIZATION_ID,CATEGORY_CODE FROM NG_ORGANIZATION_CATEGORY) 



call  count  cpu elapsed  disk  query current  rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse  1  0.00  0.00   0   0   0   0 
Execute  1 6704.07 6705.98   2 424814954   25   6 
Fetch  0  0.00  0.00   0   0   0   0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total  2 6704.07 6705.98   2 424814954   25   6 

Misses in library cache during parse: 1 
Misses in library cache during execute: 1 
Optimizer mode: ALL_ROWS 
Parsing user id: 146  (recursive depth: 1) 
Number of plan statistics captured: 1 

Rows (1st) Rows (avg) Rows (max) Row Source Operation 
---------- ---------- ---------- --------------------------------------------------- 
     0   0   0 LOAD TABLE CONVENTIONAL (cr=424814954 pr=2 pw=0 time=923492126 us) 
     6   6   6 FILTER (cr=424814953 pr=0 pw=0 time=1667461141 us) 
    414050  414050  414050 TABLE ACCESS FULL NG_ORGANIZATION_CATEGORY_GTMP (cr=1023 pr=0 pw=0 time=121231 us cost=2 size=35 card=1) 
     6   6   6 MINUS (cr=424813930 pr=0 pw=0 time=2409881660 us) 
    414050  414050  414050  SORT UNIQUE NOSORT (cr=423573150 pr=0 pw=0 time=2406932080 us cost=3 size=35 card=1) 
    414050  414050  414050  TABLE ACCESS FULL NG_ORGANIZATION_CATEGORY_GTMP (cr=423573150 pr=0 pw=0 time=2406112290 us cost=2 size=35 card=1) 
    414044  414044  414044  INDEX UNIQUE SCAN NG_ORG_CATEGORY_PK (cr=1240780 pr=0 pw=0 time=2134347 us cost=2 size=11 card=1)(object id 108100) 


Elapsed times include waiting on following events: 
    Event waited on        Times Max. Wait Total Waited 
    ---------------------------------------- Waited ---------- ------------ 
    gc cr grant 2-way        1  0.00   0.00 
    db file sequential read       2  0.13   0.13 
    gc current grant 2-way       6  0.00   0.00 
******************************************************************************** 

あなたは私を助けて、私はどのように私はこのクエリをチューニングすることができます教えてくださいもらえますか?私は並列ヒントを追加することを考えていましたが、クエリのMINUSのために無視されます。

ご意見やご要望がありましたら教えてください。

あなたの注意を喚起してください。事前に

おかげで、

ウィル

答えて

0

あなたは、内側を使用することができます(ここでするのではなく、参加する)

INSERT INTO NG_ORGANIZATION_CATEGORY(ORGANIZATION_ID,CATEGORY_CODE,ADDED_DATE) 
SELECT ORGANIZATION_ID,CATEGORY_CODE,:B1 
FROM NG_ORGANIZATION_CATEGORY_GTMP 
INNER JOIN (
    SELECT ORGANIZATION_ID,CATEGORY_CODE 
    FROM NG_ORGANIZATION_CATEGORY_GTMP 
    MINUS 
    SELECT ORGANIZATION_ID,CATEGORY_CODE 
    FROM NG_ORGANIZATION_CATEGORY 
) T1 on NG_ORGANIZATION_CATEGORY_GTMP.ORGANIZATION_ID = T1.ORGANIZATION_ID 
      and NG_ORGANIZATION_CATEGORY_GTMP.CATEGORY_CODE = T1.CATEGORY_CODE 

と簡単なヒントIN(別名フォームが選択削除有用ではありません)

+0

ありがとうございます..私はこれを試してみましょう! – Will

+0

こんにちは@scaisEdge ...私は働いて、1秒未満で走った!私はちょうどデータを確認する必要がありますが、私は挿入前にカウントMINUSを実行し、同じ数のデータを挿入しました。私は月曜日に開発者に確認し、この記事に戻ってきます!今のところ、ありがとう、あなたは男です! – Will

+0

私の答えが正しければそれを受け入れられたものとしてマークしてください...どうぞこちらをご覧ください http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – scaisEdge

0

あなたのクエリによると、gtmpテーブルにデータが挿入されるのは、カテゴリテーブルに存在しない場合のみです。あなたが存在しないソーステーブルからの行のみをターゲット表を移入するMERGE文を使用することができます

INSERT INTO NG_ORGANIZATION_CATEGORY(ORGANIZATION_ID,CATEGORY_CODE,ADDED_DATE) 
    SELECT ORGANIZATION_ID,CATEGORY_CODE,:B1 AS ADDED_DATE FROM 
    NG_ORGANIZATION_CATEGORY_GTMP T1 WHERE NOT EXISTS (
SELECT 1 FROM NG_ORGANIZATION_CATEGORY T2 WHERE T1.ORGANIZATION_ID=T2.ORGANIZATION_ID AND T1.CATEGORY_CODE=T2.CATEGORY_CODE); 
0

:あなたは、以下のクエリを試すことができます

merge into ng_organization_category noc 
using (select distinct organization_id, 
       category_code 
     from ng_organization_category_gtmp) gtmp 
    on (gtmp.organization_id = noc.organization_id 
     and gtmp.category_code = noc.category_code) 
when not matched then 
    insert (organization_id, category_code, added_date) 
    values (gtmp.organization_id, gtmp.category_code, :B1) 
/

DISTINCTにUSINGサブクエリは必要ではなく、ソースデータに依存します。 (あなたの既存のINSERTステートメントは、GTMPテーブルにそれらがある場合、の複数のインスタンスを挿入するので、問題ではありません)

+0

こんにちは@APC ..あなたの助けてくれてありがとう!有用でない場合は、デバイスがscaisEdgeによって提供された提案を検証するまで待つことになります。本当に助けに感謝します。 – Will

関連する問題