Επαναληπτική άσκηση για την ενότητα «Επεξεργασία & Βελτιστοποίηση Ερωτημάτων» Έστω οι πίνακες (A, B, C, D) και S (E, A, F), οι οποίοι έχουν οριστεί με τις ακόλουθες εντολές SQL: CEATE TABLE ( A CHA(6) PIMAY KEY, B CHA(6) UNIQUE, C CHA(8), D CHA(20), INDEX indexa ON (A) USING HASH, INDEX indexb ON (B) USING BTEE, ) CEATE TABLE S ( E CHA(4) PIMAY KEY, A CHA(6) FOEIGN KEY EFEENCES ON.A, F CHA(10), INDEX indexe ON (E) USING BTEE, ) δηλ. ο πίνακας S συνδέεται με τον πίνακα μέσω του ξένου κλειδιού S.A. Ως προς τη φυσική οργάνωση των αρχείων: Ο πίνακας είναι οργανωμένος ως αρχείο σωρού και διαθέτει ευρετήριο τύπου HASH πάνω στη στήλη.a και ευρετήριο τύπου BTEE πάνω στη στήλη.b. Υποθέτουμε ότι στο τρέχον στιγμιότυπό του έχει πλήθος εγγραφών = 10.000, μέγεθος αρχείου B = 400 σελίδες, μέγεθος ευρετηρίου B indexa = 99 σελίδες και μέγεθος ευρετηρίου B indexb = 1+99 = 100 σελίδες (δηλ. ύψος Β+δέντρου = 2). Ο πίνακας S είναι οργανωμένος και αυτός ως αρχείο σωρού και διαθέτει ευρετήριο τύπου BTEE πάνω στη στήλη S.E. Υποθέτουμε ότι στο τρέχον στιγμιότυπό του έχει πλήθος εγγραφών S = 100.000, μέγεθος αρχείου B S = 1961 σελίδες, μέγεθος ευρετηρίου B indexe = 1+8+800 = 809 σελίδες (δηλ. ύψος Β+δέντρου = 3). Γενικές παραδοχές: μέγεθος σελίδας b = 1Kb, μέγιστη χρησιμοποίηση χώρου σε κάθε σελίδα. Με βάση τα παραπάνω, περιγράψτε αναλυτικά τη διαδικασία του optimizer από τη λήψη της εντολής SQL μέχρι την απόφαση για το ποιο πλάνο θα εκτελεστεί, για τις παρακάτω εντολές SQL, θεωρώντας ότι για την πράξη της σύνδεσης μπορούμε να επιλέξουμε μεταξύ των 4 τεχνικών που έχουμε μάθει (BNLJ, INLJ, SMJ, HJ), για την πράξη της προβολής η μόνη διαθέσιμη τεχνική είναι η προβολή με ταξινόμηση, ενώ δεν εφαρμόζουμε διαδικασία pipelining (δηλ. ένα βήμα εκτελείται πλήρως και το αποτέλεσμά του δίνεται ως είσοδος στο επόμενο βήμα χωρίς όμως να υπολογίζουμε επιπλέον κόστος εγγραφής των ενδιάμεσων αποτελεσμάτων στο δίσκο): (1) SELECT * FOM WHEE.A = abcdef AND.D LIKE a% ; (2) SELECT * FOM, S WHEE.A = S.A AND S.E = xyzw ; (3) SELECT.A, S.E FOM, S WHEE.A = S.A; (4) SELECT.A FOM, S WHEE.A = S.A AND S.E = xyzw ;
Απαντήσεις: (SQL1) SELECT * FOM WHEE.A = abcdef AND.D LIKE a% ; ΣΑ1: σ θ1 Ù θ2 (), όπου θ1: [.A = abcdef ], θ2: [.D LIKE a% ] ΣΑ2: σ θ2(σ θ1()) // λόγω κανόνα 1 πάνω στη ΣΑ1 ΣΑ3: σ θ1(σ θ2()) // λόγω κανόνα 2 πάνω στη ΣΑ2 κόστος ΣΑ1: 2 // Η περίπτωση της σύνθετης επιλογής. Μεταξύ των εναλλακτικών (γραμμική αναζήτηση, αναζήτηση μέσω του HASH ευρετηρίου indexa), επιλέγουμε το δεύτερο με κόστος = 1+1 = 2 (βλ. διαφάνειες «αναζήτηση μέσω ευρετηρίου (2)» και «υλοποίηση σύνθετων επιλογών (2)») κόστος ΣΑ2: 3 (= 2 + 1) // 1 ο βήμα: αναζήτηση μέσω του HASH ευρετηρίου indexa με κόστος = 2 (βλ. διαφάνεια «αναζήτηση μέσω ευρετηρίου (2)»). Μέγεθος αποτελέσματος B = 1 σελίδα (επειδή 1 εγγραφή). // 2 ο βήμα: γραμμική αναζήτηση πάνω στο αποτέλεσμα του 1 ου βήματος με κόστος = B = 1. κόστος ΣΑ3: 408 (= 400 + 8) // 1 ο βήμα: γραμμική αναζήτηση με κόστος = Β = 400. Μέγεθος αποτελέσματος = 400/26 = 15 σελίδες (με 10.000/26 = 385 εγγραφές) με την παραδοχή ίσης πιθανότητας εμφάνισης των 26 χαρακτήρων a..z ως ο 1 ος χαρακτήρας του πεδίου.d. // 2 ο βήμα: γραμμική αναζήτηση πάνω στο αποτέλεσμα του 1 ου βήματος με κόστος = B/2 = 8. Άρα, τελική επιλογή: ΣΑ1 (εκτιμώμενο κόστος: 2) και προτεινόμενο πλάνο εκτέλεσης: σ θ1 AND θ2 (indexα) (SQL2) SELECT * FOM, S WHEE.A = S.A AND S.E = xyzw ; ΣΑ1: σ θ1 Ù θ2 ( Χ S), όπου θ1: [.A = S.A ], θ2: [ S.E = xyzw ] ΣΑ2: θ1 Ù θ2 S // λόγω κανόνα 3α πάνω στη ΣΑ1 ΣΑ3: σ θ2 ( θ1 S) // λόγω κανόνα 3β πάνω στη ΣΑ2
ΣΑ4: S θ1 Ù θ2 // λόγω κανόνα 4 πάνω στη ΣΑ2 ΣΑ5: θ1 (σ θ2(s)) // λόγω κανόνα 6α πάνω στη ΣΑ2 ΣΑ6: σ θ2 (S θ1 ) // λόγω κανόνα 4 πάνω στη ΣΑ3 ΣΑ7: (σ θ2(s)) θ1 // λόγω κανόνα 6α πάνω στη ΣΑ4 κόστος ΣΑ1: --- // το καρτεσιανό γινόμενο δεν κοστολογείται εφόσον υπάρχουν άλλες εναλλακτικές κόστος ΣΑ2: 784401 // Επιλέγουμε BNLJ με κόστος 400 X 1961 + 1 = 784401, καθώς οι υπόλοιπες τεχνικές σύνδεσης δεν εφαρμόζονται εδώ. κόστος ΣΑ3: 6283 + 2778 = 9061 Κόστη εναλλακτικών τεχνικών σύνδεσης: BNLJ = 784401, INLJ δεν εφαρμόζεται, SMJ = 2 X 400 X log400 + 2 X 1961 X log1961 + 400 + 1961 = 50342, HJ = 0 + 2 X 1961 + 400 + 1961 = 6283. Άρα επιλέγουμε HJ με κόστος 6283. Μέγεθος αποτελέσματος: θ1 S = 100.000 εγγραφές μήκους r = 54 bytes (λόγω φυσικής σύνδεσης), άρα bfr = 1024 / 54 = 18 εγγραφές/σελίδα, άρα B = 100.000 / 18 = 5556 σελίδες. Εφόσον επιλέξαμε HJ, θεωρούμε ότι το ενδιάμεσο αποτέλεσμα έχει την οργάνωση αρχείου κατακερματισμού πάνω στο πεδίο A. // 2 ο βήμα (επιλογή): Επιλέγουμε γραμμική αναζήτηση με κόστος Β/2 = 2778, καθώς οι υπόλοιπες τεχνικές επιλογής δεν εφαρμόζονται εδώ. Σημείωση: η επιλογή είναι ερώτηση ταυτότητας πάνω στο πεδίο E που είναι υποψήφιο κλειδί (unique) στο ενδιάμεσο αποτέλεσμα (γιατί;) κόστος ΣΑ4: 784401 // (βλ. ΣΑ2) κόστος ΣΑ5: 4 + 401 = 405 // 1 ο βήμα (επιλογή): Κόστη εναλλακτικών τεχνικών επιλογής: γραμμική αναζήτηση = 1961 / 2 = 981, δυαδική αναζήτηση δεν εφαρμόζεται, αναζήτηση μέσω ευρετηρίου = 3+1 = 4, απευθείας αναζήτηση δεν εφαρμόζεται. Άρα επιλέγουμε αναζήτηση μέσω ευρετηρίου = 3+1 = 4. Μέγεθος αποτελέσματος: σ θ2 () = 1 εγγραφή, άρα B = 1 σελίδα. // 2 ο βήμα (σύνδεση): Κόστη εναλλακτικών τεχνικών σύνδεσης: BNLJ = 400 Χ 1 + 1 = 401, INLJ δεν εφαρμόζεται, SMJ = 2 X 400 X log400 + 0 + 400 + 1 = 7601 (σημείωση: η δεξιά
θ1 (INLJ) πλευρά της σύνδεσης μπορεί να θεωρηθεί ήδη ταξινομημένη αφού αποτελείται από 1 σελίδα μόνο), HJ = 2 X 400 + 0 + 400 + 1 = 1201 (σημείωση: η δεξιά πλευρά της σύνδεσης μπορεί να θεωρηθεί ήδη κατακερματισμένη αφού αποτελείται από 1 σελίδα μόνο). Άρα επιλέγουμε BNLJ με κόστος 401. κόστος ΣΑ6: 7083 + 2778 = 9861 Κόστη εναλλακτικών τεχνικών σύνδεσης: BNLJ = 784401, INLJ = 1961 + 100000 Χ (1+1) = 201961, SMJ = 50342, HJ = 7083. Άρα επιλέγουμε HJ με κόστος 7083. Μέγεθος αποτελέσματος: S θ1 = 100.000 εγγραφές, B = 5556 σελίδες (βλ. ΣΑ3). Εφόσον επιλέξαμε HJ, θεωρούμε ότι το ενδιάμεσο αποτέλεσμα έχει την οργάνωση αρχείου κατακερματισμού πάνω στο πεδίο A. // 2 ο βήμα (επιλογή): Επιλέγουμε γραμμική αναζήτηση με κόστος Β/2 = 2778 (βλ. ΣΑ3). κόστος ΣΑ7: 4 + 3 = 7 // 1 ο βήμα (επιλογή): Επιλέγουμε αναζήτηση μέσω ευρετηρίου με κόστος 4 (βλ. ΣΑ5). Μέγεθος αποτελέσματος: σ θ2 () = 1 εγγραφή, άρα B = 1 σελίδα. // 2 ο βήμα (σύνδεση): Κόστη εναλλακτικών τεχνικών σύνδεσης: BNLJ = 1 Χ 400 + 1 = 401, INLJ = 1 + 1 Χ (1+1) = 3, SMJ = 7601 (βλ. ΣΑ5), HJ = 1201 (βλ. ΣΑ5). Άρα επιλέγουμε INLJ με κόστος 3. Άρα, τελική επιλογή: ΣΑ7 (εκτιμώμενο κόστος: 7) και προτεινόμενο πλάνο εκτέλεσης: σ θ2 (index-search) S (SQL3) SELECT.A, S.E FOM, S WHEE.A = S.A; ΣΑ1: π L (σ θ ( Χ S)), όπου θ: [.A = S.A ], L = {.A, S.E} ΣΑ2: π L ( θ S) // λόγω κανόνα 3α πάνω στη ΣΑ1 ΣΑ3: π L (S θ ) // λόγω κανόνα 4 πάνω στη ΣΑ2
π L (no duplicates) θ (HJ) κόστος ΣΑ1: --- // το καρτεσιανό γινόμενο δεν κοστολογείται εφόσον υπάρχουν άλλες εναλλακτικές κόστος ΣΑ2: 7083 + 5556 = 12639 Επιλέγουμε HJ με κόστος 7083 (βλ. SQL2 > ΣΑ3) Μέγεθος αποτελέσματος: θ S = 100.000 εγγραφές, B = 5556 σελίδες (βλ. SQL2 > ΣΑ3). Εφόσον επιλέξαμε HJ, θεωρούμε ότι το ενδιάμεσο αποτέλεσμα έχει την οργάνωση αρχείου κατακερματισμού πάνω στο πεδίο A. // 2 ο βήμα (προβολή): Το πεδίο E είναι υποψήφιο κλειδί (unique) στο ενδιάμεσο αποτέλεσμα (βλ. SQL2 > ΣΑ3), άρα η λίστα χαρακτηριστικών L δεν έχει διπλότυπα. Άρα δεν απαιτείται κόστος απαλοιφής διπλοτύπων (με ταξινόμηση ή κατακερματισμό). Άρα κόστος = Β = 5556. κόστος ΣΑ3: 7083 + 5556 = 12639 Επιλέγουμε HJ με κόστος 7083 (βλ. SQL2 > ΣΑ6) Μέγεθος αποτελέσματος: θ S = 100.000 εγγραφές, B = 5556 σελίδες (όπως πριν). // 2 ο βήμα (προβολή): Δεν απαιτείται κόστος απαλοιφής διπλοτύπων, άρα κόστος = 5556 (όπως πριν). Άρα, τελική επιλογή: ΣΑ2 ή ΣΑ3 (εκτιμώμενο κόστος: 12639) και προτεινόμενο πλάνο εκτέλεσης: S (SQL4) SELECT.A FOM, S WHEE.A = S.A AND S.E = xyzw ;
π L (no duplicates) θ1 (INLJ) ΣΑ1: π L (σ θ1 Ù θ2 ( Χ S)), όπου θ1: [.A = S.A ], θ2: [ S.E = xyzw ], L = {.A, S.E} Παρατηρούμε ότι είναι ακριβώς η περίπτωση της SQL2 με τη μόνη διαφορά ότι ακολουθεί ως τελική πράξη μια προβολή. Άρα ισχύουν οι SQL2 > ΣΑ2,, ΣΑ7 (κόστη, μεγέθη αποτελέσματος) και κατόπιν θα ακολουθήσει η πράξη της προβολής, δηλ. ΣΑ2: π L ( θ1 Ù θ2 S) // λόγω κανόνα 3α πάνω στη ΣΑ1 ΣΑ3: π L (σ θ2 ( θ1 S)) // λόγω κανόνα 3β πάνω στη ΣΑ2 ΣΑ4: π L (S θ1 Ù θ2 ) // λόγω κανόνα 4 πάνω στη ΣΑ2 ΣΑ5: π L ( θ1 (σ θ2(s))) // λόγω κανόνα 6α πάνω στη ΣΑ2 ΣΑ6: π L (σ θ2 (S θ1 )) // λόγω κανόνα 4 πάνω στη ΣΑ3 ΣΑ7: π L ((σ θ2(s)) θ1 ) // λόγω κανόνα 6α πάνω στη ΣΑ4 Η συνθήκη θ2 είναι ερώτηση ταυτότητας πάνω στο πεδίο E που είναι υποψήφιο κλειδί (unique) στο ενδιάμεσο αποτέλεσμα πριν την πράξη της προβολής. Άρα μέγεθος αποτελέσματος πριν την πράξη της προβολής = 1 εγγραφή, άρα B = 1 σελίδα. Άρα για την πράξη της προβολής που ακολουθεί δεν απαιτείται κόστος απαλοιφής διπλοτύπων (με ταξινόμηση ή κατακερματισμό). Άρα κόστος προβολής = Β = 1. Αυτό αθροίζεται στο εκάστοτε κόστος των εναλλακτικών που παρουσιάστηκαν στην SQL2. Άρα: κόστος ΣΑ1: --- κόστος ΣΑ2: 784401 + 1 = 784402 κόστος ΣΑ3: 9861 + 1 = 9862 κόστος ΣΑ4: 784401 + 1 = 784402 κόστος ΣΑ5: 405 + 1 = 406 κόστος ΣΑ6: 9861 + 1 = 9862 κόστος ΣΑ7: 7 + 1 = 8 Άρα, τελική επιλογή: ΣΑ7 (εκτιμώμενο κόστος: 8) και προτεινόμενο πλάνο εκτέλεσης: σ θ2 (index-search) S