Eu tenho uma consulta bastante complicada. Eu escrevi duas consultas diferentes para atingir meu objetivo. O primeiro está usando WITH, o outro está usando tabelas temporárias globais.
Primeiro:
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
O segundo:
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
Eles estão em pé de igualdade. O que quero dizer é que observo o mesmo tempo de consulta com os dois. Mas quando adiciono o índice KNO às tabelas temporárias tempA, tempB, tempC. O segundo dispara.
O que quero dizer é: fica mais rápido, muito. Eu consulto por 1 ano de valores. usando COM: cerca de 58 minutos. usando Temp Table com INDEX: cerca de 30 minutos.
Os tempos de consulta para 4 meses de valores são fornecidos abaixo.
Usando COM
DENEME@DENEME Finished 15:37:02 15:40:38 03:36 mins Select 500 WITH A
Total: 216.000 ms
Usando Tabelas Temporárias + Índice
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
Total: 16049 ms
Minha pergunta é :
Posso dar dica ao oracle para adicionar índice quando estiver construindo COM tabelas temporárias?
Não, não acho que seja possível definir um índice para uma expressão de tabela comum.
Você pode experimentar a dica de materialização , mas não acho que obterá nada mais rápido do que a solução com tabelas temporárias (indexadas).
tempA
,tempB
etempC
assim o impacto positivo de um índice será mínimo na melhor das hipóteses (na maioria dos casos, o CBO escolherá uma junção de hash para que você nem salve uma classificação) - ou seja , não tente torná-lo mais rápido magicamente adicionando índicesinsert
instruções, bem como oselect