Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels 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 26/02/2007, 11h25   #1
Nouveau Membre du Club
 
Inscription : août 2006
Messages : 137
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 137
Points : 26
Points : 26
Par défaut Tuning requête et indexes sur fonction

Bonjour à tous,
Sur Oracle9iR2,
Code :
1
2
3
4
5
6
SELECT SUBSTR(conso.other_party,1,5)||chr(9)||SUM(conso.call_duration)||chr(9)||SUM(conso.call_cost)||chr(9)||call_type||chr(9)||cust.tarsid
FROM ppc_sim_cust cust, PPC_CONSO_PAIR conso
WHERE conso.msisdn=cust.msisdn
AND conso.imsi=cust.imsi
AND TO_CHAR(call_start,'mm')='&2'
GROUP BY SUBSTR(conso.other_party,1,5), conso.call_type, cust.tarsid;
Les colonnes call_start et conso.other_party c’est des colonnes indexées, malheureusement sont négligés, et le temps de réponse de la requête met beaucoup de temps, pour l’optimiser, Je veux que les 2 indexes soient utilisés:

1/ la clause :TO_CHAR(call_start,'mm')='&2' , j’ai essayé de le transformer en
Code :
call_start BETWEEN  to_date('01/02/2007','DD/MM/YYYY') AND to_date('28/02/2007','DD/MM/YYYY')
.---> quelqu’un à une idée meilleure que la mienne ?

mais la deuxième clause ---> je n’ai pas d’idée particuliére?


2/ Pour ces deux clauses j’ai pensé a recréer l’index de fonction,
Mais je pense qu’il ya des pré requis au niveau de la base ? Pourriez-vous svp m’expliquer ?

Merci d’avance pour votre aide,
Mehdilis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 11h41   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Merci de penser à la mise en forme la prochaine fois

1/ pas mieux, c'est très bien comme ça sauf que moi je ferais :
Code :
1
2
AND call_start BETWEEN TO_DATE('01/' || '&2' || TO_CHAR(call_start,'YYYY'))
 AND ADD_MONTHS(TO_DATE('01/' || '&2' || TO_CHAR(call_start,'YYYY'),1)
2/ pourquoi Oracle utiliserait-il l'index alors qu'il n'y a pas de jointure sur la colonne ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 12h50   #3
Membre expérimenté

 
Avatar de NGasparotto
 
Nicolas Gasparotto
Inscription : janvier 2007
Messages : 424
Détails du profil
Informations personnelles :
Nom : Nicolas Gasparotto

Informations forums :
Inscription : janvier 2007
Messages : 424
Points : 500
Points : 500
Citation:
Envoyé par Fred_D
Merci de penser à la mise en forme la prochaine fois

1/ pas mieux, c'est très bien comme ça sauf que moi je ferais :
Code :
1
2
AND call_start BETWEEN TO_DATE('01/' || '&2' || TO_CHAR(call_start,'YYYY'))
 AND ADD_MONTHS(TO_DATE('01/' || '&2' || TO_CHAR(call_start,'YYYY'),1)
La clause BETWEEN étant inclusive, il vaut mieux enlever une seconde de la seconde borne. De plus, j'incluerais le format de la date. Enfin, on peut omettre le jour :
Code :
1
2
AND call_start BETWEEN TO_DATE('&2' || TO_CHAR(call_start,'YYYY'), 'MMYYYY')
 AND ADD_MONTHS(TO_DATE('&2' || TO_CHAR(call_start,'YYYY'),'MMYYYY'),1)-1/24/60/60
Nicolas.
NGasparotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2007, 13h36   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ha oui, en effet
orafrance 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 08h35.


 
 
 
 
Partenaires

Hébergement Web