Précédent   Forum des professionnels en informatique > Bases de données > Décisions SGBD > Optimisations
Optimisations Forum de conseils pour les optimisations des performances SGBD
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 10/12/2010, 21h09   #1
Membre habitué
 
Avatar de touftouf57
 
Inscription : décembre 2007
Messages : 263
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : décembre 2007
Messages : 263
Points : 105
Points : 105
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

Citation:
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 :
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 :
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 :
d=1 - 200/2000 = 0.9 --> Card(R)=(1-0.9) * 2000= 200
Est-ce correct?

Citation:
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 :
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 :
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:
Citation:
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.
__________________
Venez affronter mes brutes http://touftouf57.labrute.com - http://mori-turi.labrute.fr
touftouf57 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2010, 23h26   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 975
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 975
Points : 18 218
Points : 18 218
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement 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 22h35.


 
 
 
 
Partenaires

Hébergement Web