Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 23/12/2010, 10h26   #1
Membre régulier
 
Inscription : mai 2008
Messages : 260
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 260
Points : 89
Points : 89
Par défaut Optimisation durée requete et index

Bonjour,

J'ai la requete suivante :
Code :
SELECT max(DATE_HEURE),NOM_PROJET,REF_TURBINE FROM DATA_10MIN GROUP BY NOM_PROJET,REF_TURBINE
j'ai créé l'indice suivant :
Code :
CREATE DESC INDEX I_DATA_10MIN_DT_PRJT_TRBN ON DATA_10MIN (DATE_HEURE, NOM_PROJET, REF_TURBINE);
seulement FB ne s'en sert pas (il fait un plan natural) et comme ma table est assez grosse ca me prend plus de 5'!
Sur quoi pourrais je créer un index pour que FB s'en serve sachant que le créer sur DATE_HEURE ne sert pas à grand chose car il y a enormement de DATE_HEURE identiques (un enregistrement toutes les 10min par NOM_PROJET et par REF_TURBINE)

Merci
calou_33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 11h42   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour


Essayez cet index et dites nous ce qu'il en est :
Code sql :
1
2
3
 
CREATE DESC INDEX I_DATA_10MIN_DT_PRJT_TRBN 
ON DATA_10MIN ( NOM_PROJET, REF_TURBINE, DATE_HEURE);
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 12h08   #3
Membre régulier
 
Inscription : mai 2008
Messages : 260
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 260
Points : 89
Points : 89
Bonjour,

Avec cet autre index c'est pareil. Il fait un plan natural
calou_33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 12h26   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
C'est pourtant bien l'index qu'il vous faut pour cette requete à mon sens...

n'y a-t-il pas un problème ailleurs dans ce cas ?

L'index a-t-il bien été créé ?
et surtout :
Le plan d'exécution de votre requete a-t-il bien été régénéré suite à la création de cet index ?

Essayez de forcer l'utilisation de l'index avec un PLAN / INDEX pour voir si le temps d'exécution est toujours aussi long
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 12h48   #5
Membre régulier
 
Inscription : mai 2008
Messages : 260
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 260
Points : 89
Points : 89
Oui l'index est bien généré.
Si je veux le forcer j'ai l'erreur :
index I_DATA_10MIN_PRJT_TRBN_DT cannot be used in the specified plan.
calou_33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 14h12   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Il y a donc bien un problème avec l'index...

Je n'ai jamais touché a FB, et je ne saurai donc vous en dire plus, mais je peux vous proposer une piste a explorer : Votre index, bien que créé, est peut être en cours de construction en arrière plan, et donc indisponible ?!?


FB n'est pas très explicite dans son message d'erreur, ca ne nous aide pas !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 15h07   #7
Membre éclairé
 
Avatar de TryExceptEnd
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 435
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2006
Messages : 435
Points : 347
Points : 347
Il te faut un index sur les deux colonnes utilisées dans le GROUP BY : NOM_PROJET et REF_TURBINE.
Code :
CREATE INDEX DATA_10MIN_IDX1 ON DATA_10MIN (NOM_PROJET, REF_TURBINE);
__________________
Si vous êtes libre, choisissez le Logiciel Libre.
TryExceptEnd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 15h28   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par TryExceptEnd Voir le message
Il te faut un index sur les deux colonnes utilisées dans le GROUP BY : NOM_PROJET et REF_TURBINE.
Code :
CREATE INDEX DATA_10MIN_IDX1 ON DATA_10MIN (NOM_PROJET, REF_TURBINE);
Mais également sur l'élément max recherché, ici la date, d'où l'index que j'ai proposé sur les 3 colonnes.

Mais visiblement FB refuse d'utiliser cet index... reste à savoir pourquoi !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 15h40   #9
Membre éclairé
 
Avatar de TryExceptEnd
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 435
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2006
Messages : 435
Points : 347
Points : 347
Firebird n'utilise pas d'index sur la fonction MAX.
__________________
Si vous êtes libre, choisissez le Logiciel Libre.
TryExceptEnd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 16h12   #10
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par TryExceptEnd Voir le message
Firebird n'utilise pas d'index sur la fonction MAX.
Effectivement, les index ont l'air capricieux sous FB...

http://tracker.firebirdsql.org/brows...3Aall-tabpanel
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 16h37   #11
Membre régulier
 
Inscription : mai 2008
Messages : 260
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 260
Points : 89
Points : 89
Citation:
Firebird n'utilise pas d'index sur la fonction MAX.
Aie!!! Alors ca ca ne m'arrange pas du tout
calou_33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 17h17   #12
Membre éclairé
 
Avatar de TryExceptEnd
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 435
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2006
Messages : 435
Points : 347
Points : 347
Citation:
Envoyé par calou_33 Voir le message
Aie!!! Alors ca ca ne m'arrange pas du tout
Utilise l'index que je t'ai indiqué.
__________________
Si vous êtes libre, choisissez le Logiciel Libre.
TryExceptEnd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/12/2010, 18h51   #13
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Code :
SELECT max(DATE_HEURE),NOM_PROJET,REF_TURBINE FROM DATA_10MIN GROUP BY NOM_PROJET,REF_TURBINE
Sauf erreur de ma part, cette requête a besoin de balayer toute la table, je ne suis pas certain que de balayer un index (il lira autant de ligne indexée qu'il y a d'élément dans la table) ne change grand chose.

Pour le tester essayez de créer l'index que vous a donné TryExceptEnd

Code :
CREATE INDEX DATA_10MIN_IDX1 ON DATA_10MIN (NOM_PROJET, REF_TURBINE);
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 13h56   #14
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 213
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 213
Points : 3 315
Points : 3 315
en fait tant pis, crée quand même un index DESC sur DATE_HEURE
en fait essaie avec ces deux là
Code :
CREATE DESC INDEX I_DATA_10MIN_DT_PRJT_TRBN ON DATA_10MIN (DATE_HEURE);
et
Code :
CREATE  INDEX I_2 ON DATA_10MIN (NOM_PROJET, REF_TURBINE);
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 15h55   #15
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Citation:
Envoyé par makowski Voir le message
en fait tant pis, crée quand même un index DESC sur DATE_HEURE
en fait essaie avec ces deux là
Code :
CREATE DESC INDEX I_DATA_10MIN_DT_PRJT_TRBN ON DATA_10MIN (DATE_HEURE);
et
Code :
CREATE  INDEX I_2 ON DATA_10MIN (NOM_PROJET, REF_TURBINE);
Je pense que firebird n'utilisera que le 2eme (qu'il balayera dans son intégralité d'ailleurs).
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 16h31   #16
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 213
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 213
Points : 3 315
Points : 3 315
oui pardon, fatigue de fin d'année
le seul index possible est
Code :
CREATE  INDEX I_2 ON DATA_10MIN (NOM_PROJET, REF_TURBINE);
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2010, 17h14   #17
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Citation:
Envoyé par makowski Voir le message
oui pardon, fatigue de fin d'année
A ce sujet, bon réveillon à tous
Et longue vie à Firebird

Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2010, 20h44   #18
Membre régulier
 
Inscription : mai 2008
Messages : 260
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 260
Points : 89
Points : 89
Je vais tester l'index à mon retour de congés.
Merci à tous et bonnes fêtes
calou_33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 10h07   #19
Membre régulier
 
Inscription : mai 2008
Messages : 260
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 260
Points : 89
Points : 89
Bonjour et bonne année

Avec cet index c'est 2 fois plus rapide

Merci
calou_33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 10h37   #20
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573


mis a part que FireBird ne gere pas les index pour un MAX,

cela veut dire que FireBird ne sait pas utiliser l'index
Code :
(NOM_PROJET, REF_TURBINE, DATE_HEURE)
la ou il utilise
Code :
(NOM_PROJET, REF_TURBINE)
pour répondre a une requete ???

Il faudrait donc créer deux index dans une situation ou on aurait deux requetes, l'une qui fait un :
Code sql :
GROUP BY NOM_PROJET, REF_TURBINE

et l'autre qui fait un
Code sql :
GROUP BY NOM_PROJET, REF_TURBINE, DATE_HEURE

???
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h25.


 
 
 
 
Partenaires

Hébergement Web