かなり複雑なクエリがあります。私の目標を達成するために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にインデックスを追加するようにヒントを与えることはできますか?
いいえ、一般的なテーブル式のインデックスを定義することは不可能だと思います。
materializeヒントを試すことができますが、(インデックス付き)一時テーブルを使用したソリューションよりも速くなるとは思いません。
OracleがWITH一時テーブルを構築しているときにインデックスを追加するようにヒントを与えることはできますか?
tempA
、tempB
、およびtempC
全体に参加しているので、インデックスのプラスの影響はせいぜい最小限になります(ほとんどの場合、CBOはハッシュ結合を選択するため、あなたはソートを保存することさえしません)-すなわちしないでくださいインデックスを追加することで魔法のように速くしてくださいinsert
だけでなく3つのselect
ステートメントを含める必要があります。