Temp d'execution d'une requete SQL

feanor91
Messages postés
25
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
23 avril 2009
- 31 juil. 2007 à 17:27
feanor91
Messages postés
25
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
23 avril 2009
- 1 août 2007 à 14:53
Bonjour

Voici mon problème, j'ai  une requête un poil complexe :

SELECT Machine.*, Baie.Nom, Categorie.Categorie, Commande.NoCommande, Constructeur.Constructeur, Environnement.Environnement, Fournisseur.Fournisseur, Frequence.Frequence, Modele.Modele, OS.OS, OSMaintLevel.OSMaintLevel, Processeur.Processeur, Projet.Projet, Sauvegarde.Sauvegarde, Site.Site, SocMaintenance.Societe, SocMaintLevel.SocMaintLevel, Supervision.Supervision, TypeMachines.TypeMachine, ZoneSecu.ZoneSecu, OSRelease.OSReleaseFROM (((((((((((((((((((Machine INNER JOIN Baie ON Machine.idBaie Baie.idBaie) INNER JOIN Categorie ON Machine.idCategorie Categorie.idCategorie) INNER JOIN Commande ON Machine.idCommande = Commande.idCommande) INNER JOIN Constructeur ON Machine.idConstructeur = Constructeur.idConstructeur) INNER JOIN Environnement ON Machine.idEnvironnement = Environnement.idEnvironnement) INNER JOIN Fournisseur ON Machine.idFournisseur = Fournisseur.idFournisseur) INNER JOIN Frequence ON Machine.idFrequence = Frequence.idFrequence) INNER JOIN Modele ON Machine.idModele = Modele.idModele) INNER JOIN OS ON Machine.idOS = OS.idOS) INNER JOIN OSMaintLevel ON Machine.idOSMaintLevel = OSMaintLevel.idOSMaintLevel) INNER JOIN Processeur ON Machine.idProcesseur = Processeur.idProcesseur) INNER JOIN Projet ON Machine.idProjet = Projet.idProjet) INNER JOIN Sauvegarde ON Machine.idSauvegarde = Sauvegarde.idSauvegarde) INNER JOIN Site ON Machine.idSite = Site.idSite) INNER JOIN SocMaintenance ON Machine.idSocMaintenance = SocMaintenance.idSocMaintenance) INNER JOIN SocMaintLevel ON Machine.idSocMaintLevel = SocMaintLevel.idSocMaintLevel) INNER JOIN Supervision ON Machine.idSupervision = Supervision.idSupervision) INNER JOIN TypeMachines ON Machine.idTypeMachines = TypeMachines.idTypeMachines) INNER JOIN ZoneSecu ON Machine.idZoneSecu = ZoneSecu.idZoneSecu) INNER JOIN OSRelease ON Machine.idOSRelease = OSRelease.idOSRelease;

Mon souci est qu'elle met dans les 5 minutes pour remplir un tableadapter en vb 2005 express.

Alors deux choses, actuellement, elle me ramène 763 enregitrements, si j'enlève une centaine d'enregistrements de la table machine ou   si j'enlève 2 ou 3 tables quelconques de la liste des JOIN, elle met moins d'une seconde à s'exécuter. J'ai essayer de la réécrire avec des clauses WHERE, mais s'est encore pire. Sous Access, elle met aux alentour de 2 minutes 1/2 à rendre la main. J'ai bosser dessus toute la journée et je ne vois pas comment faire pour optimiser la chose, j'ai créé des relations, indexer tous les champs, passer l'analyseur de requête dessus, je ne vois pas ce que je peux faire de plus, si ce n'est supprimer des enregistrements dans la table, mais bon, ce n'est pas une solution.

Si quelqu'un a une idée....

Pour info, voici la requête avec un WHERE :
SELECT Machine.*, [Categorie].[Categorie], [Baie].[Nom], [CategPwd].[CategPwd], [Commande].[NoCommande], [Constructeur].[Constructeur], [Environnement].[Environnement], [Fournisseur].[Fournisseur], [Frequence].[Frequence], [Modele].[Modele], [OS].[OS], [OSMaintLevel], [OSMaintLevel], [OSRelease], [OSRelease], [Processeur].[Processeur], [Projet].[Projet], [Sauvegarde].[Sauvegarde], [Site].[Site], [SocMaintenance].[Societe], [SocMaintLevel].[SocMaintLevel], [Supervision].[Supervision], [TypeMachines].[TypeMachine], [ZoneSecu].[ZoneSecu]
FROM Machine, Categorie, Baie, CategPwd, Commande, Constructeur, Environnement, Fournisseur, Frequence, Modele, OS, OSMaintLevel, OSRelease, Processeur, Projet, Sauvegarde, Site, SocMaintenance, SocMaintLevel, Supervision, TypeMachines, ZoneSecu
WHERE [Machine].[idCategorie]=[Categorie].[idCategorie]
 And [Machine].[idBaie]=[Baie].[idBaie]
 And [Machine].[idCategPwd]=[CategPwd].[idCategPwd]
 And [Machine].[idCommande]=[Commande].[idCommande]
 And [Machine].[idConstructeur]=[Constructeur].[idConstructeur]
 And [Machine].[idEnvironnement]=[Environnement].[idEnvironnement]
 And [Machine].[idFournisseur]=[Fournisseur].[idFournisseur]
 And [Machine].[idFrequence]=[Frequence].[idFrequence]
 And [Machine].[idModele]=[Modele].[idModele]
 And [Machine].[idOS]=[OS].[idOS]
 And [Machine].[idOSMaintLevel]=[OSMaintLevel].[idOSMaintLevel]
 And [Machine].[idOSRelease]=[OSRelease].[idOSRelease]
 And [Machine].[idProcesseur]=[Processeur].[idProcesseur]
 And [Machine].[idProjet]=[Projet].[idProjet]
 And [Machine].[idSauvegarde]=[Sauvegarde].[idSauvegarde]
 And [Machine].[idSite]=[Site].[idSite]
 And [Machine].[idSocMaintenance]=[SocMaintenance].[idSocMaintenance]
 And [Machine].[idSocMaintLevel]=[SocMaintLevel].[idSocMaintLevel]
 And [Machine].[idSupervision]=[Supervision].[idSupervision]
 And [Machine].[idTypeMachines]=[TypeMachines].[idTypeMachines]
 And [Machine].[idZoneSecu]=[ZoneSecu].[idZoneSecu];

4 réponses

cs_Jack
Messages postés
14007
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
78
31 juil. 2007 à 19:25
Salut
Hélas, pas d'idée précise.
Ta structure de table semble correcte et bien adaptée (séparation des données).
Est-ce que les éléments 'id' de chaque table sont indexés ? (dans la définition de chaque table/champ)
L'indexation d'une table permet de gagner beaucoup de temps machine.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
feanor91
Messages postés
25
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
23 avril 2009

1 août 2007 à 08:13
Merci de ta réponse, gélas, oui, tout les champs faisant partie de la requête sont indexé (j'ai suivi les conseils de l'analyseur de requête). Celà semble être un problème lié au nombre de champs de la table maitre/Nombre de table secondaires, c'est totalement hallucinant et à n'y rien comprendre, ou alors, c'est une limitation du moteur JET, je vais voir pour réduire le nombre de table (en rassembler quelques unes en une seul, genre les os-osrelease...).
0
Renfield
Messages postés
17287
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
1 août 2007 à 08:27
j'aime pas trop le Machine.*
ni le fait que les noms ne soient pas délimités

sinon, ta requete m'a l'air tout a fait correcte...

c'est quoi ton SGBD ?
0
feanor91
Messages postés
25
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
23 avril 2009

1 août 2007 à 14:53
Ouais, mon nom plus, mais j'ai une centaine de colonne dans la table...., le SGBD c'est ACCES 2000, j'ai essayé le rassemblement de certaine table, mais c'est reculé pour mieux sauté, car quand le nombre de ligne augmente, le temps aussi...J'en perd mon SQL, ou alors, le pb est lié à autre chose qu'access, mais je ne sais pas trop quoi (mémore, vitesse CPU...)???
0