在 Oracle 中使用 INDEX 提示

Ati*_*gur 4 index oracle materialized-view

我有一个相当复杂的查询。我写了两个不同的查询来实现我的目标。第一个是使用 WITH,另一个是使用全局临时表。

第一:

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
Run Code Online (Sandbox Code Playgroud)

第二个:

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
Run Code Online (Sandbox Code Playgroud)

他们是相提并论的。我的意思是我对他们两个都观察到相同的查询时间。但是当我将 KNO 索引添加到 tempA、tempB、tempC 临时表时。第二个暴涨。
我的意思是:它变得更快,很多。我查询了 1 年的值。使用 WITH:约 58 分钟。使用带有 INDEX 的临时表:大约 30 分钟。

下面给出了 4 个月值的查询时间。

使用 WITH

DENEME@DENEME   Finished    15:37:02    15:40:38    03:36 mins  Select  500 WITH A
Run Code Online (Sandbox Code Playgroud)

总计: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
Run Code Online (Sandbox Code Playgroud)

总计:16049 毫秒

我的问题是:

我可以提示 oracle 在构造 WITH 临时表时添加索引吗?

a_h*_*ame 5

不,我认为为公共表表达式定义索引是不可能的。

您可以尝试使用实现提示,但我认为您不会比使用(索引)临时表的解决方案更快地获得任何东西。