ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΠΡΟΧΩΡΗΜΕΝΑ ΘΕΜΑΤΑ ΒΑΣΕΩΝ Ε ΟΜΕΝΩΝ ΦΘΙΝΟΠΩΡΟ 2006 Λύση ΑΣΚΗΣΗΣ #2 Τ. Σελλής ΕΡΩΤΗΜΑ 1: ΣΧΕ ΙΑΣΗ ΚΑΤΑΝΕΜΗΜΕΝΩΝ ΒΑΣΕΩΝ Ε ΟΜΕΝΩΝ Θεωρούµε τις ακόλουθες καθολικές σχέσεις, οι οποίες αποτελούν τµήµα του συστήµατος διαχείρισης νοσοκοµείων και ασθενών του Εθνικού πληροφοριακού συστήµατος υγείας: Νοσοκοµείο (Αριθµός_Νοσοκ,, Όνοµα_Νοσοκ, Πόλη, Τοποθεσία, Χωρητικότητα) Υπάλληλος(Αριθµός_Υπαλ, Όνοµα_Υπαλ, Αριθµός_ Νοσοκ, Ειδικότητα, Μισθός) Ασθενής (Αριθµός_Ασθενούς, Όνοµα_Ασθενούς, ιεύθυνση, Τηλέφωνο, Τοποθεσία, Ηλικία) Νοσηλεία (Αριθµός_Ασθενούς, Αριθµός_Νοσοκ, Ηµεροµηνία_Εισαγ., Ηµεροµηνία_Εξαγ, Αρ_Ασθένειας) Ασθένεια (Αριθµός_Ασθένειας, Όνοµα_Ασθένειας, Κατηγορία, Περιγραφή) Θεωρούµε ότι υπάρχουν νοσοκοµεία σε όλες τις µεγάλες πόλεις και ότι µπορούν να παρέχουν νοσηλευτικές υπηρεσίες για όλες τις κατηγορίες ασθενειών. Το πεδίο «Τοποθεσία» των σχέσεων Νοσοκοµείο και Ασθενής χρησιµεύει για εσωτερικό διαχωρισµό από το σύστηµα των βασικών διοικητικών περιοχών της Ελλάδος και παίρνει µία από τις ακόλουθες τιµές: «Βόρειος Ελλάδα», «Αθήνα», «Νότιος Ελλάδα» και «Νησιωτικές Περιοχές». Σε κάθε µία από τις συγκεκριµένες τοποθεσίες υπάρχει και ένας κεντρικός κόµβος του συστήµατος, ο οποίος χρησιµεύει για την απάντηση ερωτήσεων από το διοικητικό, το ιατρικό και το νοσηλευτικό προσωπικό. Η Ειδικότητα ενός υπαλλήλου µπορεί να είναι µία από τις: «Ιατρός», «Νοσηλευτικό Προσωπικό» και «Τεχνικό Προσωπικό». Τέλος, οι ασθένειες κατατάσσονται µε βάση την Κατηγορία τους σε: «Ελάσσονες», «Σοβαρές» και «Πολύ Σοβαρές». Θεωρούµε τις ακόλουθες σηµαντικές εφαρµογές: 1. Η πρώτη εφαρµογή χρησιµοποιείται για την επικοινωνία, µέσω αλληλογραφίας ή τηλεφωνικά, µε τους ασθενείς ανά τακτά χρονικά διαστήµατα. Ενεργοποιείται από τον κόµβο της κάθε τοποθεσίας ξεχωριστά για τους ασθενείς που ανήκουν στη συγκεκριµένη τοποθεσία και χρησιµοποιεί µόνο το Όνοµα του κάθε ασθενούς, τη ιεύθυνση και το Τηλέφωνό του. 2. Η δεύτερη εφαρµογή χρησιµοποιείται για στατιστική ανάλυση των ασθενειών. Το αποτέλεσµά της είναι αναφορές µε τον αριθµό των ασθενών ανά ηλικιακή οµάδα, δεκαετία εισαγωγής στο νοσοκοµείο (από το 1980 και µετά) και κατηγορία ασθένειας. Οι τρεις ηλικιακές οµάδες που χρησιµοποιούνται είναι: «Έως 25 ετών», «Από 26 έως και 55 ετών» και «Άνω των 55 ετών». Επειδή τα δεδοµένα των ασθενών χρησιµοποιούνται µόνο για τη στατιστική ανάλυση, ζητείται µόνο ο Αριθµός_Ασθενούς και η Ηλικία του. Παράδειγµα αποτελέσµατος της συγκεκριµένης εφαρµογής: «Για τη δεκαετία [1980-1990), στην Αθήνα νοσηλεύτηκαν 54762 ασθενείς µε Πολύ Σοβαρές ασθένειες, κτλ». 3. Η τρίτη εφαρµογή επιστρέφει τα στοιχεία νοσηλείας ενός συγκεκριµένου ασθενή σε ένα συγκεκριµένο νοσοκοµείο. έχεται ως είσοδο το Όνοµα (ή το ID) του ασθενή και το Όνοµα (ή το ID) του νοσοκοµείου και επιστρέφει όλα τα στοιχεία που υπάρχουν στο σύστηµα για τον ασθενή, τη νοσηλεία του, την ασθένειά του και το νοσοκοµείο. Η συγκεκριµένη εφαρµογή εκτελείται από τον υπεύθυνο ιατρό ενός ασθενούς ώστε να λάβει στοιχεία για το ιστορικό του και η συχνότητά της είναι 1
πολύ µικρή σε σχέση µε τις υπόλοιπες εφαρµογές (ευθύνεται για λιγότερο του 1% των προσπελάσεων στις αντίστοιχες σχέσεις). 4. Η τέταρτη εφαρµογή παρακολουθεί τους υπαλλήλους ανά ειδικότητα, τοποθεσία και χωρητικότητα του νοσοκοµείου και εκτελείται από τον κόµβο της κάθε τοποθεσίας ξεχωριστά για τους υπαλλήλους που εργάζονται σε κάποιο νοσοκοµείο που βρίσκεται στην συγκεκριµένη τοποθεσία. Η διάκριση όσον αφορά τη χωρητικότητα είναι ανάµεσα σε νοσοκοµεία µε λιγότερους ή περισσότερους από 50 υπαλλήλους. Για κάθε global relation σχεδιάστε το σχήµα κατάτµησης (fragmentation schema) αιτιολογώντας τη σχεδίασή σας. Για κάθε primary horizontal fragmentation, πρoσδιορίστε τα minterm predicates και τις προϋποθέσεις που πρέπει να πληρούνται ώστε η κατάτµηση να είναι disjoint και complete. Για κάθε παραγόµενη κατάτµηση αναφέρετε προϋποθέσεις που πρέπει να πληρούνται ώστε τα αντίστοιχα join graphs να είναι partitioned ή simple. Λύση Οι εφαρµογές που χρησιµοποιούνται έχουν τις εξής βασικές εκφράσεις: Εφαρµογή 1 π Όνοµα_Ασθενούς, ιεύθυνση, Τηλέφωνο (σ Τοποθεσία = «Βόρειος Ελλάδα» Ασθενής) π Όνοµα_Ασθενούς, ιεύθυνση, Τηλέφωνο (σ Τοποθεσία = «Αθήνα» Ασθενής) π Όνοµα_Ασθενούς, ιεύθυνση, Τηλέφωνο (σ Τοποθεσία = «Νότιος Ελλάδα» Ασθενής) π Όνοµα_Ασθενούς, ιεύθυνση, Τηλέφωνο (σ Τοποθεσία = «Νησιωτικές Περιοχές» Ασθενής) Εφαρµογή 2 σ (Ηλικία 25) ΑΝD (Ηµεροµηνία_Εισαγ. [1980-1989] AND (Κατηγορία = «Ελάσσονες») ) (Ασθενής Νοσηλεία Ασθένεια) σ (Ηλικία 25) ΑΝD (Ηµεροµηνία_Εισαγ. [1980-1989] AND (Κατηγορία = «Σοβαρές») ) (Ασθενής Νοσηλεία Ασθένεια) σ (Ηλικία 25) ΑΝD (Ηµεροµηνία_Εισαγ. [1980-1989] AND (Κατηγορία = «Πολύ Σοβαρές») ) (Ασθενής Νοσηλεία Ασθένεια) σ (Ηλικία 26 AND Ηλικία 55) ΑΝD (Ηµεροµηνία_Εισαγ. [1980-1989] AND (Κατηγορία = «Ελάσσονες») ) (Ασθενής Νοσηλεία Ασθένεια) σ (Ηλικία > 55) ΑΝD (Ηµεροµηνία_Εισαγ. [2000-2009] AND (Κατηγορία = «Πολύ Σοβαρές») ) (Ασθενής Νοσηλεία Ασθένεια) Λόγω περιορισµένου χώρου, στις παραπάνω εκφράσεις δεν φαίνεται ότι επιλέγονται τελικά µόνο ο Αριθµός_Ασθενούς, η Ηλικία, η Ηµεροµηνία_Εισαγωγής και η Κατηγορία. Στη συνέχεια, φυσικά, εκτελείται και ένα GROUP BY των αποτελεσµάτων σε συνδυασµό µε COUNT(*), το οποίο όµως δεν επηρεάζει την επιλογή της κατάτµησης. Εφαρµογή 3 σ (Όνοµα_Ασθενούς = INPUT_XXX) AND (Όνοµα_Νοσοκ = INPUT_YYY) (Ασθενής Νοσηλεία Ασθένεια Νοσοκοµείο) Εφαρµογή 4 σ (Τοποθεσία = «Βόρειος Ελλάδα») AND (Χωρητικότητα 50) AND (Ειδικότητα = «Ιατρός») (Νοσοκοµείο Υπάλληλος) σ (Τοποθεσία = «Βόρειος Ελλάδα») AND (Χωρητικότητα 50) AND (Ειδικότητα = «Νοσηλευτικό Προσωπικό») (Νοσοκοµείο Υπάλληλος) σ (Τοποθεσία = «Βόρειος Ελλάδα») AND (Χωρητικότητα 50) AND (Ειδικότητα = «Τεχνικό Προσωπικό») (Νοσοκοµείο Υπάλληλος) σ (Τοποθεσία = «Αθήνα») AND (Χωρητικότητα 50) AND (Ειδικότητα = «Ιατρός») (Νοσοκοµείο Υπάλληλος) 2
σ (Τοποθεσία = «Νησιωτικές Περιοχές») AND (Χωρητικότητα > 50) AND (Ειδικότητα = «Τεχνικό Προσωπικό») (Νοσοκοµείο Υπάλληλος) Με βάση τα παραπάνω, ακολουθεί στη συνέχεια µία ενδεικτική λύση, η οποία, φυσικά, είναι µία από τις πολλές που θα µπορούσε να έχει κανείς. Αρχικά, παρατηρούµε ότι η βασική έκφραση της εφαρµογής 3 δεν µπορεί να ικανοποιείται από καµίας µορφής κατάτµηση πέρα από το να βρίσκονται όλες οι σχέσεις στον ίδιο κόµβο. Οποιαδήποτε κατάτµηση κάποιας από τις σχέσεις έχει ως αποτέλεσµα καθυστερήσεις στην εκτέλεση του συγκεκριµένου ερωτήµατος, καθώς η επιλογή των ασθενών και των νοσοκοµείων είναι αυθαίρετη και επιπλέον δεν υπάρχει κάποιος περιορισµός της µορφής: «Όλοι οι ασθενείς µίας περιοχής νοσηλεύονται µόνο σε νοσοκοµεία της ίδιας περιοχής». Επειδή όµως η συχνότητα εκτέλεσης της συγκεκριµένης εφαρµογής είναι µικρή σε σχέση µε τις υπόλοιπες εφαρµογές και ευθύνεται για πολύ µικρό ποσοστό του συνολικού φόρτου του συστήµατος, επιλέγουµε να µην την λάβουµε υπόψη µας κατά τη διαδικασία επιλογής των επιθυµητών κατατµήσεων. Η συγκεκριµένη επιλογή βασίζεται στο ότι θεωρούµε ότι οποιαδήποτε αύξηση στο χρόνο εκτέλεσής της εφαρµογής 3 είναι αµελητέα σε σχέση µε τον χρόνο εκτέλεσης των υπόλοιπων ερωτηµάτων του συστήµατος και ότι υπερκαλύπτεται από το κέρδος που έχουµε από τις υπόλοιπες εφαρµογές. Με βάση τις εφαρµογές 1 και 2, προκύπτουν δύο κάθετες κατατµήσεις της σχέσης Ασθενής: Ασθενής1 = π Αριθµός_Ασθενούς, Όνοµα_Ασθενούς, ιεύθυνση, Τηλέφωνο, Τοποθεσία, Ασθενής Ασθενής2 = π Αριθµός_Ασθενούς, Ηλικία Ασθενής Στη συνέχεια, µε βάση την εφαρµογή 1 έχουµε τα ακόλουθα κατηγορήµατα από τα οποία προκύπτει περαιτέρω οριζόντια κατάτµηση της σχέσης Ασθενής1: p1: Τοποθεσία = «Βόρειος Ελλάδα» p2: Τοποθεσία = «Αθήνα» p3: Τοποθεσία = «Νότιος Ελλάδα» P4: Τοποθεσία = «Νησιωτικές Περιοχές» Ασθενής11 = σ Τοποθεσία =«Βόρειος Ελλάδα» Ασθενής1 Ασθενής12 = σ Τοποθεσία = «Αθήνα» Ασθενής1 Ασθενής13 = σ Τοποθεσία = «Νότιος Ελλάδα» Ασθενής1 Ασθενής14 = σ Τοποθεσία = «Νησιωτικές Περιοχές» Ασθενής1 Αντίστοιχα, µε βάση την εφαρµογή 2 έχουµε τα ακόλουθα σύνθετα κατηγορήµατα από τα οποία προκύπτει περαιτέρω οριζόντια κατάτµηση της σχέσης Ασθενής2: p5: Ηλικία 25 p6: (Ηλικία 26) AND (Ηλικία 55) p7: Ηλικία > 55 Ασθενής21 = σ Ηλικία 25 Ασθενής2 Ασθενής22 = σ (Ηλικία 26) AND (Ηλικία 55) Ασθενής2 Ασθενής23 = σ Ηλικία > 55 Ασθενής2 3
Είναι προφανές ότι η κατάτµηση της σχέσης Ασθενής στις {Ασθενής11, Ασθενής12, Ασθενής13, Ασθενής14, Ασθενής21, Ασθενής22, Ασθενής23}είναι πλήρης και διαχωρίσιµη. Η σχέση Ασθενής µπορεί να προκύψει από το JOIN των Ασθενής1 και Ασθενής2, οι οποίες ανακατασκευάζονται πλήρως εκτελώντας ένωση στα αντίστοιχα τµήµατά τους. Επιπλέον, τα σύνθετα κατηγορήµατα από τα οποία προκύπτουν οι οριζόντιες κατατµήσεις καλύπτουν όλο το πεδίο τιµών των αντίστοιχων πεδίων. Με βάση την εφαρµογή 4, έχουµε δύο οµάδες απλών κατηγορηµάτων που µπορούµε να χρησιµοποιήσουµε για την κατάτµηση της σχέσης Νοσοκοµείο: q1: Τοποθεσία = «Βόρειος Ελλάδα» q2: Τοποθεσία = «Αθήνα» q3: Τοποθεσία = «Νότιος Ελλάδα» q4: Τοποθεσία = «Νησιωτικές Περιοχές» q5: Χωρητικότητα 50 q6: Χωρητικότητα > 50 Οι επιτρεπτοί συνδυασµοί µεταξύ τους µας δίνουν ένα πλήρες και διακριτό σύνολο σύνθετων κατηγορηµάτων που κατατέµνει την σχέση Νοσοκοµείο ως εξής: Νοσοκοµείο1 = σ Τοποθεσία =«Βόρειος Ελλάδα» ΑΝD Χωρητικότητα 50 Νοσοκοµείο Νοσοκοµείο2 = σ Τοποθεσία = «Αθήνα» ΑΝD Χωρητικότητα 50 Νοσοκοµείο Νοσοκοµείο3 = σ Τοποθεσία = «Νότιος Ελλάδα» ΑΝD Χωρητικότητα 50 Νοσοκοµείο Νοσοκοµείο4 = σ Τοποθεσία = «Νησιωτικές Περιοχές» ΑΝD Χωρητικότητα 50 Νοσοκοµείο Νοσοκοµείο5 = σ Τοποθεσία =«Βόρειος Ελλάδα» ΑΝD Χωρητικότητα > 50 Νοσοκοµείο Νοσοκοµείο6 = σ Τοποθεσία = «Αθήνα» ΑΝD Χωρητικότητα > 50 Νοσοκοµείο Νοσοκοµείο7 = σ Τοποθεσία = «Νότιος Ελλάδα» ΑΝD Χωρητικότητα > 50 Νοσοκοµείο Νοσοκοµείο8 = σ Τοποθεσία = «Νησιωτικές Περιοχές» ΑΝD Χωρητικότητα > 50 Νοσοκοµείο Στη συνέχεια κάνουµε την κατάτµηση της σχέσης Ασθένεια. Αυτό γίνεται µε βάση την δεύτερη εφαρµογή, οπότε έχουµε τα ακόλουθα σύνθετα κατηγορήµατα: Ασθένεια1 = σ Κατηγορία = «Ελάσσονες» Ασθένεια Ασθένεια2 = σ Κατηγορία = «Σοβαρές» Ασθένεια Ασθένεια3 = σ Κατηγορία = «Πολύ Σοβαρές» Ασθένεια g1: Κατηγορία = «Ελάσσονες» g2: Κατηγορία = «Σοβαρές» g3: Κατηγορία = «Πολύ Σοβαρές» Είναι προφανές ότι έχουµε ένα πλήρες σύνολο όρων, οι οποίοι είναι και διακριτοί µεταξύ τους. Επίσης, από την δεύτερη εφαρµογή προκύπτει η µικτή κατάτµηση για τη σχέση Νοσηλεία. Αρχικά, έχουµε οριζόντια κατάτµηση της σχέσης, έτσι όπως προκύπτει από τα κατηγορήµατα: g4: Ηµεροµηνία_Εισαγ. [1980-1989] g5: Ηµεροµηνία_Εισαγ. [1990-1999] g6: Ηµεροµηνία_Εισαγ. [2000-2009] Νοσηλεία 1 = σ Ηµεροµηνία_Εισαγ. [1980-1989] Νοσηλεία Νοσηλεία2 = σ Ηµεροµηνία_Εισαγ. [1990-1999] Νοσηλεία Νοσηλεία3 = σ Ηµεροµηνία_Εισαγ. [2000-2000] Νοσηλεία 4
Είναι προφανές ότι η συγκεκριµένη κατάτµηση είναι πλήρης και διαχωρίσιµη. Στη συνέχεια, και πάλι λόγω της δεύτερης εφαρµογής, προκύπτει η ακόλουθη παραγόµενη κατάτµηση: Νοσηλεία1.1 = (Νοσηλεία1 Ασθενής21) Ασθένεια1 Νοσηλεία1.2 = (Νοσηλεία1 Ασθενής21) Ασθένεια2 Νοσηλεία1.3 = (Νοσηλεία1 Ασθενής21) Ασθένεια3 Νοσηλεία1.4 = (Νοσηλεία1 Ασθενής22) Ασθένεια1 Νοσηλεία1.9 = (Νοσηλεία1 Ασθενής23) Ασθένεια3 Νοσηλεία2.1 = (Νοσηλεία2 Ασθενής21) Ασθένεια1 Νοσηλεία2.9 = (Νοσηλεία2 Ασθενής23) Ασθένεια3 Νοσηλεία3.1 = (Νοσηλεία3 Ασθενής21) Ασθένεια1 Νοσηλεία3.9 = (Νοσηλεία3 Ασθενής23) Ασθένεια3 Άρα τελικά η παραγόµενη κατάτµηση αποτελείται από 27 σχέσεις. Ο γράφος σύνδεσης για την συγκεκριµένη κατάτµηση είναι καθολικός, καθώς όλα τα τµήµατα της σχέσης Ασθενής συνδέονται µε όλα τα τµήµατα της σχέσης Ασθένεια. Για να γίνει διαχωρισµένος ο συγκεκριµένος γράφος θα έπρεπε να ισχύει µία επιπλέον σχέση ανάµεσα στους ασθενείς και τις ασθένειες, έτσι ώστε συγκεκριµένες κατηγορίες ασθενειών να συνδέονται µόνο µε συγκεκριµένες ηλικιακές οµάδες ασθενών: π.χ. οι ασθενείς ηλικιών µέχρι και 25 ετών νοσηλεύονται µόνο για «Ελάσσονες» ή «Σοβαρές» ασθένειες. Τέλος, από την εφαρµογή 4 προκύπτουν τα ακόλουθα σύνθετα κατηγορήµατα για την σχέση Υπάλληλος: g7: Ειδικότητα = «Ιατρός» g8: Ειδικότητα = «Νοσηλευτικό Προσωπικό» g9: Ειδικότητα = «Τεχνικό Προσωπικό» Οπότε, προκύπτει η ακόλουθη οριζόντια κατάτµηση: Υπάλληλος1 = σ Ειδικότητα = «Ιατρός» Υπάλληλος Υπάλληλος2 = σ Ειδικότητα = «Νοσηλευτικό Προσωπικό» Υπάλληλος Υπάλληλος3 = σ Ειδικότητα = «Τεχνικό Προσωπικό» Υπάλληλος Είναι προφανές ότι έχουµε ένα πλήρες σύνολο όρων, οι οποίοι είναι και διακριτοί µεταξύ τους. Στη συνέχεια, και πάλι λόγω της ίδιας εφαρµογής, προκύπτει η ακόλουθη παραγόµενη κατάτµηση: Υπάλληλος1.1 = Υπάλληλος1 Νοσοκοµείο1 Υπάλληλος1.2 = Υπάλληλος1 Νοσοκοµείο2 Υπάλληλος1.8 = Υπάλληλος1 Νοσοκοµείο8 Υπάλληλος2.1 = Υπάλληλος2 Νοσοκοµείο1 Υπάλληλος2.8 = Υπάλληλος2 Νοσοκοµείο8 Υπάλληλος3.1 = Υπάλληλος3 Νοσοκοµείο1 5
Υπάλληλος3.8 = Υπάλληλος3 Νοσοκοµείο8 Άρα τελικά η παραγόµενη κατάτµηση αποτελείται από 24 σχέσεις. Ο γράφος σύνδεσης για την συγκεκριµένη κατάτµηση είναι καθολικός, καθώς όλες οι κατηγορίες υπαλλήλων εργάζονται σε όλα τα νοσοκοµεία. Για να έχουµε έναν απλό γράφο σύνδεσης θα έπρεπε να µην έχουµε κάνει την αρχική οριζόντια κατάτµηση της σχέσης Υπάλληλος στις Υπάλληλος1, Υπάλληλος2 και Υπάλληλος3 αλλά µόνο την ακόλουθη παραγόµενη κατάτµηση: Υπάλληλος_A = Υπάλληλος Νοσοκοµείο1 Υπάλληλος_B = Υπάλληλος Νοσοκοµείο2 Υπάλληλος_Θ = Υπάλληλος Νοσοκοµείο8 Η συγκεκριµένη κατάτµηση έχει απλό γράφο σύνδεσης. ΕΡΩΤΗΜΑ 2: ΕΠΕΞΕΡΓΑΣΙΑ ΕΡΩΤΗΣΕΩΝ ΣΕ ΚΑΤΑΝΕΜΗΜΕΝΕΣ ΒΑΣΕΙΣ Ε ΟΜΕΝΩΝ Θεωρείστε τις σχέσεις Hotel, Reservation και Customer µίας αλυσίδας ξενοδοχείων: HOTEL (HID:integer, H_NAME:CHAR(22), LOCATION:CHAR(50), CATEGORY:integer) CUSTOMER (CID:integer, C_NAME:CHAR(22), PHONE:CHAR(14)) RESERVATION (RID:integer, CID:integer, HID:integer, DATE:datetime, PRICE:real) Θεωρούµε ότι οι ακέραιοι έχουν µέγεθος 4 bytes, οι πραγµατικοί (real) 8 bytes, οι χαρακτήρες 1 byte και ο τύπος datetime 10 bytes, οπότε η σχέση HOTEL περιέχει εγγραφές των 80 bytes, η σχέση CUSTOMER εγγραφές των 40 bytes και η σχέση RESERVATION εγγραφές των 30 bytes. Η σχέση HOTEL περιέχει 20 σελίδες, η σχέση CUSTOMER περιέχει 200 σελίδες και η σχέση RESERVATION περιέχει 3000 σελίδες. Το µέγεθος µιας σελίδας είναι 8.000 bytes, το κόστος του κάθε Ι/Ο είναι T d και το κόστος αποστολής µιας σελίδας είναι Ts = 40Td. Οι εγγραφές στέλνονται από ένα κόµβο σε ένα άλλο σε σελίδες (δηλαδή αν είναι λιγότερες σε µέγεθος από µια σελίδα, θεωρούµε ότι στέλνεται ολόκληρη η σελίδα). Οι δυνατές κατηγορίες (αστέρια) ενός ξενοδοχείου είναι από «1» έως και «6». Η σχέση HOTEL έχει υποστεί οριζόντια κατάτµηση µε βάση το ακόλουθο πλήρες σύνολο κατηγορηµάτων: p1: LOCATION = «EUROPE» p2: LOCATION = «US» p3: LOCATION = «ASIA» Από το οποίο προκύπτει η ακόλουθη οριζόντια κατάτµηση της σχέσης HOTEL: HOTEL1 = σ LOCATION = «EUROPE» HOTEL HOTEL2 = σ LOCATION = «US» HOTEL HOTEL3 = σ LOCATION = «ASIA» HOTEL Η σχέσεις HOTEL2 και CUSTOMER είναι αποθηκευµένες στη Νέα Υόρκη, η σχέση HOTEL3 στο Hong Kong, η σχέση HOTEL1 στo Παρίσι και η σχέση RESERVATION στην Αθήνα. εν υπάρχουν ευρετήρια σε καµία σχέση. Με δεδοµένη την ερώτηση: SELECT C_NAME, PRICE FROM WHERE CUSTOMER, RESERVATION, HOTEL (CUSTOMER.CID=RESERVATION.CID) AND (RESERVATION.HID=HOTEL.HID) AND (HOTEL.CATEGORY > 4) 6
και α) ότι η ερώτηση αυτή τίθεται από ένα χρήστη στο Λονδίνο, β) ότι η σχέση HOTEL1 έχει το 40% των εγγραφών της σχέσης HOTEL, η σχέση HOTEL2 έχει το 40% των εγγραφών και η σχέση HOTEL3 έχει το 20% των εγγραφών, γ) ότι άνω των 4 αστέρων είναι µόνο το 10% των ξενοδοχείων στην Ευρώπη και την Αµερική και το 5% στην Ασία, δ) ότι µόνο το 10% των κρατήσεων είναι για ξενοδοχεία άνω των 4 αστέρων. βρείτε το κόστος απάντησης της ερώτησης µε τον καθένα από τους παρακάτω τρόπους: α) Μετέφερε όλες τις σχέσεις στη Νέα Υόρκη, υπολόγισε εκεί το αποτέλεσµα και στείλε το στο Λονδίνο. β) Υπολόγισε το αποτέλεσµα στο Λονδίνο, αφού πρώτα µεταφέρεις εκεί όλες τις σχέσεις. γ) Υπολόγισε το αποτέλεσµα στην Αθήνα µε χρήση semi-joins και στείλε το στο Λονδίνο. Στο συγκεκριµένο πλάνο εκτέλεσης, η επιλογή των κατάλληλων ξενοδοχείων (µε πάνω από 4 αστέρια) να γίνει τοπικά σε κάθε κόµβο πριν σταλούν οι εγγραφές στην Αθήνα και γενικότερα να µετακινηθεί ο ελάχιστος όγκος πληροφορίας ανάµεσα στους κόµβους. Σηµείωση: υποθέστε ότι το join µεταξύ δύο σχέσεων γίνεται πάντα µε sort-merge, το οποίο έχει κόστος 3*(Μ+Ν)*T d όπου Μ, Ν τα µεγέθη των σχέσεων σε σελίδες. Επίσης, η ένωση ανάµεσα σε δύο σχέσεις έχει κόστος 2*(Μ+Ν)*T d. Λύση Σύµφωνα µε τα όσα δίνονται: Η σχέση HOTEL1 έχει o εγγραφές των 80 bytes και µέγεθος 8 σελίδες o (8 * 8000) / 80 = 800 εγγραφές. Η σχέση HOTEL2 έχει o εγγραφές των 80 bytes και µέγεθος 8 σελίδες. o (8 * 8000) / 80 = 800 εγγραφές. Η σχέση HOTEL3 έχει o εγγραφές των 80 bytes και µέγεθος 4 σελίδες. o (4 * 8000) / 80 = 400 εγγραφές. Η σχέση CUSTOMER έχει o εγγραφές των 40 bytes και µέγεθος 200 σελίδες o (200 * 8000) / 40 = 40,000 εγγραφές. Η σχέση RESERVATION έχει o εγγραφές των 30 bytes και µέγεθος 3000 σελίδες o (3000 * 8000) / 30 = 800,000 εγγραφές. Επίσης, από τα επιµέρους ποσοστά προκύπτει ότι 9% των συνολικών εγγραφών της σχέσης HOTEL αντιστοιχούν σε ξενοδοχεία άνω των 4 αστέρων. α) Το συνολικό κόστος προκύπτει ως εξής: 1. Μεταφορά της HOTEL3 στη Νέα Υόρκη: 4 * 40 * Τ d = 160 Τ d. 2. Μεταφορά της HOTEL1 στη Νέα Υόρκη: 8 * 40 * Τ d = 320 Τ d. 3. Μεταφορά της RESERVATION στη Νέα Υόρκη: 3000 * 40 * Τ d = 120,000 Τ d. 4. Υπολογισµός HOTEL 12 = HOTEL1 HOTEL2: 2*(8+8)*T d = 32 Τ d. 5. Υπολογισµός HOTEL = HOTEL 12 HOTEL3: 2*(16+4)*T d = 40 Τ d. 7
6. Υπολογισµός του HOTEL = σ CATEGORY > 4 HOTEL: 22 Τ d. Ανάγνωση της HOTEL από το δίσκο: 20 Τ d. Το αποτέλεσµα θα έχει µέγεθος 0.09 * 20 = 1.8 σελίδες. Άρα, εγγραφή στο δίσκο του αποτελέσµατος: 2 Τ d. 7. Υπολογισµός του ΤΕΜP1 = HOTEL RESERVATION: 3*(2+3000)*T d = 9006 T d. 8. Αποθήκευση της TEMP1 στο δίσκο: 1060 Τ d. Εφόσον µόνο το 10% των κρατήσεων είναι για ξενοδοχεία άνω των 4 αστέρων, στο αποτέλεσµα θα υπάρχουν 800,000 * 0.1 = 80,000 εγγραφές. Κάθε εγγραφή του TEMP1 θα έχει µέγεθος (80 + 30) 4 = 106 bytes. Συνεπώς, ο αντίστοιχος αριθµός σελίδων στο TEMP1 θα είναι (80000 * 106) / 8000 = 1060 σελίδες. 9. Υπολογισµός του ΤΕΜP2 = TEMP1 CUSTOMER: 3*(1060 +200)*T d = 3780 T d. 10. Προβολή από την TEMP2 των πεδίων C_NAME και PRICE: 1420 Τ d. Η σχέση TEMP2 θα έχει 80,000 εγγραφές, όσες και η TEMP1. Κάθε εγγραφή του TEMP2 θα έχει µέγεθος (106 + 40) 4 = 142 bytes. Συνεπώς, ο αντίστοιχος αριθµός σελίδων στο TEMP2 θα είναι (80000 * 142) / 8000 = 1420 σελίδες. 11. Μεταφορά του τελικού αποτελέσµατος στο Λονδίνο: 300 Τ s = 300 * 40 * Τ d = 12000 Τ d. Το τελικό αποτέλεσµα της ερώτησης έχει εγγραφές των 30 bytes και συνολικά 80,000 εγγραφές. Συνεπώς, το τελικό αποτέλεσµα θα έχει µέγεθος (80000 * 30) / 8000 = 300 σελίδες. Τελικά, το συνολικό κόστος απάντησης της ερώτησης είναι: T1 = 160 Τ d + 320 Τ d + 120,000 Τ d + 32 Τ d + 40 Τ d + 22 Τ d + 9006 T d + 1060 Τ d + 3780 T d + 1420 Τ d + 12000 Τ d = 147,840 Τ d. β) Το συνολικό κόστος προκύπτει ως εξής: 1. Μεταφορά της HOTEL1 στο Λονδίνο: 8 * 40 * Τ d = 320 Τ d. 2. Μεταφορά της HOTEL2 στο Λονδίνο: 8 * 40 * Τ d = 320 Τ d. 3. Μεταφορά της HOTEL3 στο Λονδίνο: 4 * 40 * Τ d = 160 Τ d. 4. Μεταφορά της CUSTOMER στο Λονδίνο: 200 * 40 * Τ d = 8,000 Τ d. 5. Μεταφορά της RESERVATION στο Λονδίνο: 3000 * 40 * Τ d = 120,000 Τ d. Τα υπόλοιπα βήµατα είναι ίδια µε τα βήµατα 4-10 του υποερωτήµατος (α) 6. Υπολογισµός HOTEL 12 = HOTEL1 HOTEL2: 2*(8+8)*T d = 32 Τ d. 7. Υπολογισµός HOTEL = HOTEL 12 HOTEL3: 2*(16+4)*T d = 40 Τ d. 8. Υπολογισµός του HOTEL = σ CATEGORY > 4 HOTEL: 22 Τ d. Ανάγνωση της HOTEL από το δίσκο: 20 Τ d. Το αποτέλεσµα θα έχει µέγεθος 0.09 * 20 = 1.8 σελίδες. Άρα, εγγραφή στο δίσκο του αποτελέσµατος: 2 Τ d. 9. Υπολογισµός του ΤΕΜP1 = HOTEL RESERVATION: 3*(2+3000)*T d = 9006 T d. 10. Αποθήκευση της TEMP1 στο δίσκο: 1060 Τ d. Εφόσον µόνο το 10% των κρατήσεων είναι για ξενοδοχεία άνω των 4 αστέρων, στο αποτέλεσµα θα υπάρχουν 800,000 * 0.1 = 80,000 εγγραφές. Κάθε εγγραφή του TEMP1 θα έχει µέγεθος (80 + 30) 4 = 106 bytes. 8
Συνεπώς, ο αντίστοιχος αριθµός σελίδων στο TEMP1 θα είναι (80000 * 106) / 8000 = 1060 σελίδες. 11. Υπολογισµός του ΤΕΜP2 = TEMP1 CUSTOMER: 3*(1060 +200)*T d = 3780 T d. 12. Προβολή από την TEMP2 των πεδίων C_NAME και PRICE: 1420 Τ d. Η σχέση TEMP2 θα έχει 80,000 εγγραφές, όσες και η TEMP1. Κάθε εγγραφή του TEMP2 θα έχει µέγεθος (106 + 40) 4 = 142 bytes. Συνεπώς, ο αντίστοιχος αριθµός σελίδων στο TEMP2 θα είναι (80000 * 142) / 8000 = 1420 σελίδες. Τελικά, το συνολικό κόστος απάντησης της ερώτησης είναι: T2 = 320 Τ d + 320 Τ d + 160 Τ d + 8,000 Τ d + 120,000 Τ d + 32 Τ d + 40 Τ d + 22 Τ d + 9006 T d + 1060 Τ d + 3780 T d + 1420 Τ d = 144,160 Τ d. γ) Το συνολικό κόστος προκύπτει ως εξής: 1. Υπολογισµός στo Παρίσι του HOTEL1 = σ CATEGORY > 4 HOTEL1: 9 Τ d. Ανάγνωση της HOTEL1 από το δίσκο: 8 Τ d. Το αποτέλεσµα θα έχει µέγεθος 0.1 * 8 = 0.8 σελίδες. Άρα, εγγραφή στο δίσκο του αποτελέσµατος: 1 Τ d. Προβολή από την HOTEL1 του πεδίου HID (HOTEL1 = π HID HOTEL1 ) : 1 Τ d. Αποστολή της HOTEL1 στην Αθήνα: 1 * Τ s = 40 * Τ d. Η σχέση HOTEL1 θα έχει 0.1 * 800 = 80 εγγραφές. Κάθε εγγραφή του HOTEL1 θα έχει µέγεθος 4 bytes. Συνεπώς, ο αντίστοιχος αριθµός σελίδων στο HOTEL1 θα είναι (80 * 4) / 8000 = 0.04 σελίδες. Άρα, συνολικό κόστος: 50 Τ d. 2. Υπολογισµός στη Νέα Υόρκη του HOTEL2 = σ CATEGORY > 4 HOTEL2: 9 Τ d. Ανάγνωση της HOTEL2 από το δίσκο: 8 Τ d. Το αποτέλεσµα θα έχει µέγεθος 0.1 * 8 = 0.8 σελίδες. Άρα, εγγραφή στο δίσκο του αποτελέσµατος: 1 Τ d. Προβολή από την HOTEL2 του πεδίου HID (HOTEL2 = π HID HOTEL2 ) : 1 Τ d. Αποστολή της HOTEL2 στην Αθήνα: 1 * Τ s = 40 * Τ d. Η σχέση HOTEL2 θα έχει 0.1 * 800 = 80 εγγραφές. Κάθε εγγραφή του HOTEL1 θα έχει µέγεθος 4 bytes. Συνεπώς, ο αντίστοιχος αριθµός σελίδων στο HOTEL2 θα είναι (80 * 4) / 8000 = 0.04 σελίδες. Άρα, συνολικό κόστος: 50 Τ d. 3. Υπολογισµός στo Hong Kong του HOTEL3 = σ CATEGORY > 4 HOTEL3: 5 Τ d. Ανάγνωση της HOTEL3 από το δίσκο: 4 Τ d. Το αποτέλεσµα θα έχει µέγεθος 0.05 * 4 = 0.2 σελίδες. Άρα, εγγραφή στο δίσκο του αποτελέσµατος: 1 Τ d. Προβολή από την HOTEL3 του πεδίου HID (HOTEL3 = π HID HOTEL3 ) : 1 Τ d. Αποστολή της HOTEL3 στην Αθήνα: 1 * Τ s = 40 * Τ d. Η σχέση HOTEL3 θα έχει 0.05 * 400 = 20 εγγραφές. Κάθε εγγραφή του HOTEL3 θα έχει µέγεθος 4 bytes. Συνεπώς, ο αντίστοιχος αριθµός σελίδων στο HOTEL3 θα είναι (20 * 4) / 8000 = 0.01 σελίδες. Άρα, συνολικό κόστος: 46 Τ d. 4. Στη Νέα Υόρκη, προβολή από τη σχέση CUSTOMER των πεδίων CID και C_NAME: CUSTOMER = π CID, C_NAME CUSTOMER Κόστος: 200 Τ d. 5. Μεταφορά της CUSTOMER στην Αθήνα: 130 * 40 * Τ d = 5200 Τ d. Η σχέση CUSTOMER θα έχει 40,000 εγγραφές, όσες και η CUSTOMER. Κάθε εγγραφή της σχέσης CUSTOMER θα έχει µέγεθος (22 + 4) = 26 bytes. Συνεπώς, ο αντίστοιχος αριθµός σελίδων της CUSTOMER θα είναι (40000*26) / 8000 = 130 σελίδες. 9
6. Υπολογισµός HOTEL 12 = HOTEL1 HOTEL2 : 2*(1+1)*T d = 4 Τ d. Η σχέση HOTEL 12 θα έχει 160 εγγραφές και µέγεθος 0.08 σελίδες. 7. Υπολογισµός HOTEL = HOTEL 12 HOTEL3: 2*(1+1)*T d = 4 Τ d. Η σχέση HOTEL θα έχει 180 εγγραφές και µέγεθος 0.09 σελίδες. 8. Υπολογισµός του ΤΕΜP1 = RESERVATION HOTEL : 3*(3000 + 1)*T d = 9003 T d. 9. Αποθήκευση της TEMP1 στο δίσκο: 300 Τ d. Εφόσον µόνο το 10% των κρατήσεων είναι για ξενοδοχεία άνω των 4 αστέρων, στο αποτέλεσµα θα υπάρχουν 800,000 * 0.1 = 80,000 εγγραφές. Κάθε εγγραφή του TEMP1 θα έχει µέγεθος 30 bytes (όσα και οι εγγραφές της σχέσης Reservation λόγω του semi-join). Συνεπώς, ο αντίστοιχος αριθµός σελίδων στο TEMP1 θα είναι (80000 * 30) / 8000 = 300 σελίδες. 10. Υπολογισµός του ΤΕΜP2 = TEMP1 CUSTOMER : 3*(300 +130)*T d = 1290 T d. 11. Προβολή από την TEMP2 των πεδίων C_NAME και PRICE: 520 Τ d. Η σχέση TEMP2 θα έχει 80,000 εγγραφές, όσες και η TEMP1. Κάθε εγγραφή του TEMP2 θα έχει µέγεθος (30 + 26) 4 = 52 bytes. Συνεπώς, ο αντίστοιχος αριθµός σελίδων στο TEMP2 θα είναι (80000 * 52) / 8000 = 520 σελίδες. 12. Μεταφορά του τελικού αποτελέσµατος στο Λονδίνο: 300 Τ s = 300 * 40 * Τ d = 12000 Τ d. Το τελικό αποτέλεσµα της ερώτησης έχει εγγραφές των 30 bytes και συνολικά 80,000 εγγραφές. Συνεπώς, το τελικό αποτέλεσµα θα έχει µέγεθος (80000 * 30) / 8000 = 300 σελίδες. Τελικά, το συνολικό κόστος απάντησης της ερώτησης είναι: T3 = 50 Τ d + 50 Τ d + 46 Τ d + 200 Τ d + 5200 Τ d + 4 Τ d + 4 Τ d + 9003 T d + 300 Τ d + 1290 T d + 520 Τ d + 12000 Τ d = 28,667 Τ d. Παρατηρούµε πόσο µικρότερο κόστος έχει η λύση που χρησιµοποιεί semi-joins σε σχέση µε τις δύο προηγούµενες. 10