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 24/07/2011, 12h49   #1
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
Par défaut Code à optimiser

Salut !

mon 1er code
Code :
1
2
3
4
5
6
7
8
9
10
11
FROM tb_process
   INNER JOIN tb_step ON (tb_process.code_step = tb_step.code_step)
   INNER JOIN tb_energie ON (tb_step.code_step = tb_energie.code_step)
   INNER JOIN tb_unite ON (tb_step.code_unite = tb_unite.code_unite)
   AND (tb_process.date_bilan = tb_energie.date_mois)
 
WHERE 
   (
      ((tb_process.date_bilan BETWEEN :date_debut AND :date_fin) AND
       (tb_energie.date_mois BETWEEN :date_debut AND :date_fin))
   )

mon 2ème code
Code :
1
2
3
4
5
6
7
8
9
10
FROM tb_process
   INNER JOIN tb_step ON (tb_process.code_step = tb_step.code_step)
   INNER JOIN tb_energie ON (tb_step.code_step = tb_energie.code_step)
   INNER JOIN tb_unite ON (tb_step.code_unite = tb_unite.code_unite)
 
WHERE 
   (
      (  (tb_process.date_bilan = tb_energie.date_mois) AND (tb_process.date_bilan BETWEEN :date_debut AND :date_fin) AND
       (tb_energie.date_mois BETWEEN :date_debut AND :date_fin))
   )
dans le 1er code la condition
Citation:
tb_process.date_bilan = tb_energie.date_mois
est dans les jointures mais dans le second elle est dans la clause where.

Le résultat obtenu est le même mais d'après vous quel est le code le plus optimisé point de vue rapidité puisque ma base de données est distante.

Merci par avance.
__________________
Bon courage ou Bonne Chance (selon le contexte)
Just-Soft est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2011, 17h00   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Selon mes connaissances empiriques et la logiques, les 2 codes sont corrects et auront le même "niveau" d’exécution.

Penses à regarder les plans d'exécution généré, a priori ils devraient être identique.

par contre, je modifierais la requête sous cette forme

Code :
1
2
3
4
5
6
7
8
9
10
....
FROM tb_process
   INNER JOIN tb_step ON (tb_process.code_step = tb_step.code_step)
   INNER JOIN tb_energie ON (tb_step.code_step = tb_energie.code_step AND (tb_process.date_bilan = tb_energie.date_mois)
   INNER JOIN tb_unite ON (tb_step.code_unite = tb_unite.code_unite)
WHERE 
   (
      ((tb_process.date_bilan BETWEEN :date_debut AND :date_fin) AND
       (tb_energie.date_mois BETWEEN :date_debut AND :date_fin))
   )
et même :
Code :
1
2
3
4
5
....
FROM tb_process
   INNER JOIN tb_step ON (tb_process.code_step = tb_step.code_step AND tb_process.date_bilan BETWEEN :date_debut AND :date_fin)
   INNER JOIN tb_energie ON (tb_step.code_step = tb_energie.code_step AND tb_process.date_bilan = tb_energie.date_mois AND tb_energie.date_mois BETWEEN :date_debut AND :date_fin)
   INNER JOIN tb_unite ON (tb_step.code_unite = tb_unite.code_unite)
Là aussi la vitesse devrait être la même
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 13h27   #3
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
Ok mais je crois qu'avec des tables énormes c'est mieux d'utiliser la 1ière forme.
__________________
Bon courage ou Bonne Chance (selon le contexte)
Just-Soft est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 16h11   #4
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Je ne vois pas pourquoi, mais les super-experts de firebird devraient connaitre la réponse

As tu regardé les plans d’exécution, à mon humble avis, ils doivent être identiques
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 16h25   #5
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
Citation:
Envoyé par dehorter olivier Voir le message
Je ne vois pas pourquoi, mais les super-experts de firebird devraient connaitre la réponse

As tu regardé les plans d’exécution, à mon humble avis, ils doivent être identiques
Re,

je viens de voir les plans pour les deux requêtes, ils sont identiques.
__________________
Bon courage ou Bonne Chance (selon le contexte)
Just-Soft est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 10h48   #6
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
Peut aussi s'écrire :
Code :
1
2
3
4
5
 
....
FROM tb_process, tb_step, tb_energie, tb_unite
WHERE
tb_process.code_step = tb_step.code_step AND tb_process.date_bilan BETWEEN :date_debut AND :date_fin AND tb_step.code_step = tb_energie.code_step AND tb_process.date_bilan = tb_energie.date_mois AND tb_energie.date_mois BETWEEN :date_debut AND :date_fin AND tb_step.code_unite = tb_unite.code_unite
D'un point de vue de la norme SQL, et pour faciliter la lecture des requetes SQL il est préférable de laisser dans le WHERE les critères de sélection et dans les jointures apres le ON uniquement ce qui sert à lier les tables (le plus souvent correspond aux clés étrangères liées aux clés primaires).

Donc la forme :
Code :
1
2
3
4
5
6
7
8
9
....
FROM tb_process
   INNER JOIN tb_step ON (tb_process.code_step = tb_step.code_step)
   INNER JOIN tb_energie ON (tb_step.code_step = tb_energie.code_step AND (tb_process.date_bilan = tb_energie.date_mois)
   INNER JOIN tb_unite ON (tb_step.code_unite = tb_unite.code_unite)
WHERE 
   (
      ((tb_process.date_bilan BETWEEN :date_debut AND :date_fin) AND
       (tb_energie.date_mois BETWEEN :date_debut AND :date_fin))
Est plus adaptée.
Barbibulle 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 11h49.


 
 
 
 
Partenaires

Hébergement Web