Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/06/2008, 11h59   #1
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 73
Points : 26
Points : 26
Par défaut Query rewrite avec les vues matérialisées

Bonjour,

Est ce qu'une requête sur une table détails, doit être identique à celle de la création de la vue matérialisée utilisant cette table pour qu'elle soit réécrite en utilisant cette vue matérialisée?
h_ismaili est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 13h38   #2
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
Non, en fait l'Optimizer va chercher à utiliser le QUERY REWRITE si :
  • Si le texte de la requête est syntaxiquement le même.
  • Si le texte de la requête n'est pas le même mais que les éléments du select, du from et du where reviennent mathématiquement à la même chose.
  • Si les tables impactées sont toutes locales.
Exemple :
Code :
SELECT a,b,c FROM t WHERE a=1 AND b=3;
Est identique pour lui à :
Code :
SELECT c,a,b FROM t WHERE b=3 AND a=1;
Pour plus d'informations, lit le bouquin : Oracle® Database Data Warehousing Guide 10g Release 2 (10.2) : Part V §17
__________________
Pas de réponse aux messages privés. Faites un post pour vos problèmes, que tout le monde en profite...
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 15h17   #3
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 73
Points : 26
Points : 26
merci pour ta réponse... mais je crois que je me suis mal exprimé.

pour être plus précis :

Voici la requête de création de la vue matérialisée :


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
	 ID_DATE, 
	 CALL_DIRC, 
	 CALL_TYP, 
	 CALL_TYP2, 
	 COUNT(*) AS "NOMB_APPL", 
	 SUM(VOLM) AS "VOLM", 
	 SUM(CHFF_AFFR_HT) AS "CHFF_AFFR_HT", 
	 SUM(COUT_HT) AS "COUT_HT" 
FROM 
	TICKETS_INTERCO TI 
WHERE 
	 NOT EXISTS ( SELECT 1 FROM NUMERO_EXCLU NE WHERE TI.CALLING_NUMB_BILL = NE.NUMR_TELP 
					   	 OR TI.CALLED_NUMB_BILL = NE.NUMR_TELP ) 
GROUP BY 
	  ID_DATE, CALL_DIRC, CALL_TYP, CALL_TYP2
et voici la requête qui devrait être réécrite par oracle:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT  
			ID_DATE,
			count(*) AS "NB_APPL", 
			SUM(CASE WHEN (CALL_DIRC='OUT' AND CALL_TYP2 IN ('1','15')) THEN 0 ELSE NVL(VOLM,0) END) AS "VOLM"
		FROM 
			[Datamart Trafic].TICKETS_INTERCO TI
		WHERE 
			ID_DATE BETWEEN '01/01/2008' AND '07/01/2008'-->= sysdate() - 7  
			AND NOT EXISTS ( SELECT 1 FROM [Datamart Trafic].NUMERO_EXCLU NE WHERE TI.CALLING_NUMB_BILL = NE.NUMR_TELP 
					   	 OR TI.CALLED_NUMB_BILL = NE.NUMR_TELP )
		GROUP BY 
			ID_DATE
le plan d'exécution indique un passage par l'index de date pour parcourir la table tickets_interco.

pourriez vous m'indiquer sur quel niveau ça bloque?
h_ismaili est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 15h32   #4
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
D'un point de vue analytique cela semble pouvoir fonctionner, maintenant il y a l'Optimizer qui peut considérer que passer par la table initiale va plus vite...

Tu peux tenter de forcer le REWRITE avec un HINT.
Code :
SELECT /*+ REWRITE */ ...
__________________
Pas de réponse aux messages privés. Faites un post pour vos problèmes, que tout le monde en profite...
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 16h01   #5
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 73
Points : 26
Points : 26
ça marche toujours pas... auriez vous une autre idée??
h_ismaili est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 16h06   #6
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
Je ne suis pas spécialiste en QUERY REWRITE mais il se peut que ton CASE mette la grouille.

Tente la requête avec les éléments brut de force (A l'identique de ta vue matérialisée). ensuite par évolution change et teste ta requête afin d'arriver à tes fins.

Tu verras bien où ça bloque...
__________________
Pas de réponse aux messages privés. Faites un post pour vos problèmes, que tout le monde en profite...
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 16h12   #7
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 73
Points : 26
Points : 26
je l'ai fait, mais une fois que j'enlève n'importe quel champ du select ça marche plus
h_ismaili est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 16h27   #8
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
Essai bête et méchant, si tu n'enlève aucun champs et que tu ne fais que rajouter (Il suffit de ne pas traiter ceux en trop), ça donne quoi ?
__________________
Pas de réponse aux messages privés. Faites un post pour vos problèmes, que tout le monde en profite...
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 16h32   #9
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 73
Points : 26
Points : 26
ça marche toujours pas, mais là ça peut se comprendre puisque le champ demandé n'est pas disponible dans la vue matérialisée.
h_ismaili est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 16h33   #10
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
En ce cas peux-tu déporter les éléments liés à ta vue matérialisée (select, from & where) dans une sous-requte ?
__________________
Pas de réponse aux messages privés. Faites un post pour vos problèmes, que tout le monde en profite...
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 16h35   #11
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
J'avais ma lu, il faut que TOUS tes champs de la table que tu veux bypasser soient dans la vue matérialisée...

Ici il te manque VOLM.
__________________
Pas de réponse aux messages privés. Faites un post pour vos problèmes, que tout le monde en profite...
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 16h52   #12
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 73
Points : 26
Points : 26
Le VOLM est dans le case
h_ismaili est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 16h55   #13
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
Tu as SUM(VOLM) et non VOLM. Oracle ne peut traduire que le VOLM d'une requête correspond à une pseudo colonne calculée dans une vue matérialisée.
__________________
Pas de réponse aux messages privés. Faites un post pour vos problèmes, que tout le monde en profite...
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 17h04   #14
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 73
Points : 26
Points : 26
oui vous avez raison mais faites attention au 'AS':
SUM(VOLM) AS "VOLM"
h_ismaili est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 17h12   #15
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
C'est bien ce que je dis, dans ton CASE tu checke la valeur de VOLM (La colonne) et dans ta vue matérialisée tu fourni un SUM(VOLM) (Et pas la colonne VOLM elle-même).

Donc, il est normal qu'il aille chercher la colonne VOLM dans la table, et le reste avec.

L'Oracle n'est ni un devin, ni un adepte des boules de crystal...

__________________
Pas de réponse aux messages privés. Faites un post pour vos problèmes, que tout le monde en profite...
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 17h37   #16
Nouveau Membre du Club
 
Inscription : décembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 73
Points : 26
Points : 26
ok,
mais malgré cela ça marche pas, en fait, la requête de la vue matérialisée ne peut pas être réécrite, une fois qu'on enlève une colone du group by!!!
h_ismaili est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2008, 08h49   #17
Membre chevronné
 
Avatar de philcero
 
Inscription : septembre 2007
Messages : 519
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : septembre 2007
Messages : 519
Points : 649
Points : 649
J'avais pas vu non lus, décidément, il faut effectivement que la vue matérialisée corresponde mathématiquement à une partie de ta requête. Si il faut triturer le résultat pour en sortir le besoin, elle ne sera pas prise en compte...
__________________
Pas de réponse aux messages privés. Faites un post pour vos problèmes, que tout le monde en profite...
philcero est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h57.


 
 
 
 
Partenaires

Hébergement Web