web-dev-qa-db-fra.com

Avec l'utilisation d'index indique à Oracle

J'ai une requête assez compliquée. J'ai écrit deux requêtes différentes pour accomplir mon objectif. La première utilise avec, d'une autre utilise des tables temporaires globales.

Premier:

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

Deuxième:

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

Ils sont au pair. Ce que je veux dire, c'est que je observe même le même temps de requête avec les deux. Mais lorsque j'ajoute l'index de Kno à Tempa, TempB, Tableaux temporaires TEMPC. Deuxième skyrockets.
[.____] Ce que je veux dire, c'est que ça devient plus rapide, beaucoup. Je demande pendant 1 an de valeurs. en utilisant avec: environ 58 minutes. Utilisation de Table Table avec Index: environ 30 minutes.

Temps de requête pendant 4 mois de valeurs sont donnés ci-dessous.

En utilisant avec

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

Total: 216000 MSECS

Utilisation de tables temporaires + index

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 msecs

Ma question est :

Puis-je donner un indice à Oracle pour ajouter index quand il construit avec des tables temporaires?

4
Atilla Ozgur

Non, je ne pense pas que la définition d'un index pour une expression de table commune est possible.

Vous pouvez expérimenter avec la matérialiser indice, mais je ne pense pas que vous obtiendrez quelque chose plus rapidement que la solution avec des tables temporaires (indexées).

5

Puis-je donner un indice à Oracle pour ajouter index quand il construit avec des tables temporaires?

  • Une clause CTE ou 'avec' ne signifie pas nécessairement que Oracle 'construit des tables temporaires' - c'est SQL, vous dites généralement à la base de données ce que vous voulez, plutôt que de l'obtenir
  • il y a un indice de demander à la CBO de construire une table temporaire - mais des allusions sont un dernier recours - si le CBO choisit le mauvais plan, la première chose à faire est de savoir pourquoi (par exemple: mauvais statistiques)
  • vous rejoignez l'ensemble de tempA, tempB _ et tempC _ Ainsi, l'impact positif d'un indice sera au mieux au mieux (dans la plupart des cas, le CGO choisira une jointure de hachage. Vous ne sauverrez même pas une sorte) - c'est-à-dire ne essayer de le rendre plus rapide par magie en ajoutant des index
  • comparez-vous des pommes avec des pommes? Le "temps de requête" pour le cas avec des tableaux temporaires doit inclure les trois états insert ainsi que le select