web-dev-qa-db-ja.com

OracleでのINDEXヒントの使用

かなり複雑なクエリがあります。私の目標を達成するために2つの異なるクエリを作成しました。最初のものはWITHを使用しており、もう1つはグローバル一時テーブルを使用しています。

最初の1つ:

WITH A
(
 KNO 
 ..
 )
 , B
 (
 KNO
 ...
 )
 , C
 (
 KNO
 ...
 )
 SELECT * from 
 A INNER JOIN B 
 on A.KNO = B.KNO
 INNER JOIN C
 on B.KNO = C.KNO

二つ目:

Truncate Table tempA;
Truncate Table tempB;
Truncate Table tempC;

INSERT INTO tempA SELECT -- Same select which constructs WITH A
INSERT INTO tempB SELECT -- Same select which constructs WITH B
INSERT INTO tempC SELECT -- Same select which constructs WITH C

 SELECT * from 
 tempA A INNER JOIN tempB B 
 on A.KNO = B.KNO
 INNER JOIN tempC C
 on B.KNO = C.KNO

彼らは同等です。つまり、両方で同じクエリ時間を観察しています。しかし、tempA、tempB、tempCの一時テーブルにKNOインデックスを追加すると、 2つ目が急上昇しました。
私が言いたいのは、それはずっと速くなる、ということです。 1年間の値をクエリします。 WITHの使用:約58分。一時テーブルとINDEXの併用:約30分。

4か月の値のクエリ時間を以下に示します。

WITHの使用

DENEME@DENEME   Finished    15:37:02    15:40:38    03:36 mins  Select  500 WITH A

合計:216000ミリ秒

一時テーブルとインデックスの使用

DENEME@DENEME   Finished    15:41:54    15:41:55    1 sec   Select  500 WITH D
DENEME@DENEME   Finished    15:41:38    15:41:38    665 msecs   Insert  34660   INSERT INTO C
DENEME@DENEME   Finished    15:41:21    15:41:35    14 secs Insert  34660   INSERT INTO B 
DENEME@DENEME   Finished    15:41:17    15:41:17    109 msecs   Insert  1804    INSERT INTO  A
DENEME@DENEME   Finished    15:41:12    15:41:12    33 msecs    Unknown 0   TRUNCATE TABLE C
DENEME@DENEME   Finished    15:41:12    15:41:12    39 msecs    Unknown 0   TRUNCATE TABLE B
DENEME@DENEME   Finished    15:41:11    15:41:11    203 msecs   Unknown 0   TRUNCATE TABLE A

合計:16049ミリ秒

私の質問は:

WITH一時テーブルを作成するときに、Oracleにインデックスを追加するようにヒントを与えることはできますか?

4
Atilla Ozgur

いいえ、一般的なテーブル式のインデックスを定義することは不可能だと思います。

materializeヒントを試すことができますが、(インデックス付き)一時テーブルを使用したソリューションよりも速くなるとは思いません。

OracleがWITH一時テーブルを構築しているときにインデックスを追加するようにヒントを与えることはできますか?

  • CTEまたは「with」句は、必ずしもOracleが「一時テーブルを構築する」ことを意味するわけではありません。これはSQLであり、通常、データベースを取得する方法ではなく、必要なものをデータベースに伝えます。
  • cBOに「一時テーブルを作成するように依頼するヒントがあります。ただし、ヒントは最後の手段です。CBOが間違ったプランを選択している場合、最初にすべきことはwhy(eg:悪い統計)
  • tempAtempB、およびtempC全体に参加しているので、インデックスのプラスの影響はせいぜい最小限になります(ほとんどの場合、CBOはハッシュ結合を選択するため、あなたはソートを保存することさえしません)-すなわちしないでくださいインデックスを追加することで魔法のように速くしてください
  • リンゴとリンゴを比較していますか?一時テーブルの場合の「クエリ時間」には、insertだけでなく3つのselectステートメントを含める必要があります。