IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Optimisations SGBD Discussion :

Comment estimer correctement la taille des résultats d'une requête


Sujet :

Optimisations SGBD

  1. #1
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut Comment estimer correctement la taille des résultats d'une requête
    Bonjour,


    Tout est dans le titre.
    J'ai un exam la semaine prochaine, et ça fait 24h que je me torture les méninges sur la BDD. Sur le sujet de l'an dernier, il y a un exo pour l'optimisation des requetes.

    Voila la base de données

    Vol( NoVol, partDe, ArriveA, HeureDep)
    Personnel(Matricule, Nom, Catégorie, Fonction)
    Participer(NoVol, DateDépart, Matricule)
    Catégorie: {'Navigant technique'n 'Navigant Commercial', "Non Navigant'}

    Etant donné les informations statistiques suivantes:
    La fonction 'Pilote' n'est possible que pour la catégorie 'navigant technique';
    Card(Personnel)=600;
    Card(Participer)=1 000 000;
    V(Fonction,Personnel)=20;
    V(DateDépart,Participer)=500;
    Taille d'un n-uplet de Personnel = 50 octets
    Taille d'un n-uplet de Participer = 20 octets
    Taille d'un bloc B = 2000 octets
    Taille d'un pointeur de bloc = 10

    a) En moyenne, combien de vol partent chaque jour? Sachant qu'en moyenne, dans un vol, il y a 10 membres d'équipage du personnel 'Navigant'
    J'ai compris par cette question que je devais estimer la taille de cette requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT NoVol
    FROM Participer p
    WHERE p.Date='une date'
    Ce qui me donne en algèbre relationnel

    R=PJ(RS(Participer/DateDepart='1/1/2011'),(NoVol))

    Et donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    R1=RS(Participer/DateDepart='1/1/2011')
    Card(R1)=Card(Participer)/V(DateDepart/Participer)
    Card(R1)=1 000 000/500=2000
     
    R= PJ(R1,( NoVol))
    Card(R)=(1-d) Card(R1) avec d=1-(V(NoVol/R1)/Card(R1))
     
    mais V(NoVol/R1)=Card(R1)/10
     exact? Avec la précision de 10 navigant par vol
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d=1 - 200/2000 = 0.9 --> Card(R)=(1-0.9) * 2000= 200
    Est-ce correct?

    Question b)
    Donnez en nombre de n-uplets la taille du résultat de la requête suivant:
    PJ( NJN( RS(Personnel/Catégorie='Navigant Technique' et Fonction= 'Pilote'),
    RS(Participer/DateDépart='1/12/2009')), (Matricule))


    J'obtiens donc la restriction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    R1=RS(Personnel/Catégorie='Navigant Technique' et Fonction= 'Pilote');
    card(R1) = p(Q1) * p(Q2) * Card(R1) puisque le critère est un 'et'
    card(R1)= (1/V(Catégorie/Personnel)) * (1/V(Fonction/Personnel)) * Card(Personnel).
    V(Fonction/Personnel) = 20 
    V(Catégorie/Personnel) = 3 cf la liste des fonctions du sujet.
    Card(Personnel) = 600
    d'ou
    Card(R1)=10
    La seconde restriction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    R2=RS(Participer/DateDépart = '1/12/09')
    Card(R2)=Card(Participer)/V(DateDépart/Participer)
    Card(Participer) = 1 000 000
    V(DateDépart/Participer) = 500
    d'ou Card(R2) = 2000
    c'est toujours juste?

    Et Maintenant mon problème Je ne vois pas quelle fonction je dois utiliser pour la jointure Natural JoiN.
    Est ce que quelqu'un pourrait m'éxpliquer laquelle on dois prendre et quand?
    Quand on joint sur des non-clés, sur des clés, je pige pas les autres cas.
    Dans mon "cours" j'ai:
    Si U1 inter U2 = 0 alors la jointure aura la cardinalité: Card(R1) * Card(R2)
    Si U1 inter U2 = clé de R2 alors la cardinalité de la jointure sera <=Card(R1)
    Si U1 inter U2 = {A / A n'est ni clé de R1, ni clé de R2} alors on utilise le V(A,R)
    Justement dans mon cas la jointure se fait bien sur des clés. Mais prendre uniquement la cardinalité de 10 alors que j'ai 2000 en face, ça me trouble. Parce que la requête affichera pour chaque vol les personnels à bord. On trouvera donc plusieurs fois le même personnel pour des vol différents, ou des dates différentes.

    J'espère trouver une aide précieuse à ce sujet.
    PS: Je précise bien que ce n'est pas "faitmesdevoirs.com", je veux vraiment capter ce que je fais, parce que recopier bêtement, cela ne m'intéresse pas du tout.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 792
    Points : 34 013
    Points
    34 013
    Billets dans le blog
    14
    Par défaut
    Je crois que cette question a déjà été postée sur l'un des forums bases de données de Developpez.com il y a moins d'un an. Utilise l'outil de recherche.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/01/2015, 07h57
  2. [SQL-Server] Taille limite des résultats d'une requête
    Par AllezTFC dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/05/2008, 22h03
  3. Comment afficher le rang des résultats d'une requête sous Access 2002
    Par painpepper dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 15/08/2007, 02h19
  4. Pagination des résultats d'une requête
    Par dl_jarod dans le forum ASP
    Réponses: 2
    Dernier message: 17/10/2005, 15h30
  5. Calcul à partir des résultats d'une requète
    Par Sendo dans le forum Access
    Réponses: 1
    Dernier message: 29/09/2005, 18h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo