我有一个相当复杂的查询。我写了两个不同的查询来实现我的目标。第一个是使用 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
第二个:
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
他们是平等的。我的意思是我观察到他们两个的查询时间相同。但是当我将 KNO 索引添加到 tempA、tempB、tempC 临时表时。第二个暴涨。
我的意思是:它变得更快,很多。我查询 1 年的值。使用 WITH:大约 58 分钟。使用带有 INDEX 的 Temp Table:大约 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 毫秒
我的问题是:
我可以提示 oracle 在构建 WITH 临时表时添加索引吗?
不,我认为为公共表表达式定义索引是不可能的。
您可以尝试使用具体化提示,但我认为您不会比使用(索引)临时表的解决方案更快。
tempA
,tempB
因此tempC
索引的积极影响充其量是最小的(在大多数情况下,CBO 将选择散列连接,因此您甚至不会保存排序)-即不要尝试使其更快通过添加索引神奇地insert
语句以及select