Page 1 of 1

Παραξενιές του SELECT στον SQL Server 2005

Posted: Sat Oct 20, 2007 11:57 am
by Zifnab
Καθόμουν και έπαιζα με τα εισαγωγικά της SQL και παρατήρησα το εξής χαζό φαινόμενο:

Έφτιαξα 4 μονόστηλους πίνακες (με τη στήλη 'Εlement') ως εξης:


A.element=1,2,3,4,5
B.element=a,b,c,d,e,f
C.element=#,$,%
D.element=A,B,C,D,E

Παρατηρήστε ότι τα μεγέθη των πινάκων είναι αντίστοιχα 5,6,3,5 διότι πάνω σε αυτά στηρίχθηκα για τα αποτελέσματα που έβγαλα....

κάνω λοιπόν:

Code: Select all

SELECT A.Element,B.Element 
    FROM A,B ή FROM B,A
και προκύπτει το εξής με |Α|*|Β| γραμμές (παρατηρήστε ότι πως συμπεριφέρεται για |Α|<|Β|):

Code: Select all

Element Element
1 a
1 b
1 c
1 d
1 e
1 f
2 a
2 b
2 c
2 d
2 e
2 f
....
5 a
5 b
5 c
5 d
5 e
5 f

Code: Select all

SELECT A.Element,C.Element 
    FROM A,C ή FROM C,A
και προκύπτει το εξής με |Α|*|C| γραμμές (παρατηρήστε ότι πως συμπεριφέρεται για |Α|>|C|):

Code: Select all

Element Element
1 #
2 #
3 #
4 #
5 #
1 $
2 $
3 $
4 $
5 $
1 %
2 %
3 %
4 %
5 %

Code: Select all

SELECT A.Element,D.Element 
    FROM A,D 
και προκύπτει το εξής με |Α|*|D| γραμμές (παρατηρήστε ότι πως συμπεριφέρεται για |Α|=|D| με FROM A,D):

Code: Select all

Element Element
1 Α
2 Α
3 Α
4 Α
5 Α
1 Β
2 Β
3 Β
4 Β
5 Β
...
1 Ε
2 Ε
3 Ε
4 Ε
5 Ε
Ενώ με:

Code: Select all

SELECT A.Element,D.Element 
    FROM D,A 
και προκύπτει το εξής με |Α|*|D| γραμμές (παρατηρήστε ότι πως συμπεριφέρεται για |Α|=|D| με FROM D,A):

Code: Select all

Element Element
1 Α
1 B
1 C
1 D
1 E
2 Α
2 B
2 C
2 D
2 E
...
5 Α
5 B
5 C
5 D
5 E


Μπορείτε να μου εξηγήσετε γιατί αυτό το χάος με τους πίνακες και το στήσιμο που κάνει ο MS SQL ανάλογα με την συσχέτιση των μεγεθών των πινάκων? Στα δύο τελευταία παραδείγματα δεν περίμενα να έχει διαφορά η σειρά των πινάκων στο FROM (FROM A,D / FROM D,A)...Για να μην πω τί γίνεται με 3 και περισσότερους πίνακες στο ίδιο query και επιπλέον όταν κάποιοι απο αυτούς είναι ισομεγέθεις ή άδειοι....

Posted: Sat Oct 20, 2007 12:23 pm
by tsilochr
σε προβληματίζει η ταξινόμηση των πλειάδων που έκανε ανάλογα με το γινόμενο πινάκων στο from clause? Δεν μου φαίνεται για παραξενιά όσο για speed optimizing. Βάζει το μικρότερο πίνακα μπροστά για να κάνει μάλλον πιο γρήγορα το πολλαπλασιασμό

Posted: Sat Oct 20, 2007 12:28 pm
by Zifnab
Ναι αλλά θα περίμενα να μην τα κάνει by default και στις δύο πρώτες περιπτώσεις, ανάλογα με το αν ο A είναι μικρότερος απο το B και μεγαλύτερος από το C

Code: Select all

1 a        
1 b
1 c   
1 d
1 e
1 f

vs

1 #
2 #
3 #
4 #
5 # 
και ξαφνικά το FROM όταν οι πίνακες είναι ισομεγέθεις παίζει ρόλο :shock:

speed optimized - για εξήγησε plz το πάνω σε αυτή την εφαρμογή... thnx

Posted: Sat Oct 20, 2007 12:34 pm
by tsilochr
προφανώς τον εξυπηρετεί να μπαίνει ο μικρός πίνακας μπροστά. αν είναι ίσοι του είναι αδιάφορο.

Σκέψου ένα απλό αλγόριθμο για πολλαπλασιασμό 2 αριθμών

Code: Select all

muliply (X, Y){
var result = 0;
 for 1 to X
       result +=Y
return result
}
Αυτό είναι χαζό γιατι αν πω muliply (10000, 2) θα κάνει 10000 επαναλήψεις. Οπότε ο αλγόριθμος μάλλον θα είναι

Code: Select all

muliply (X, Y){
if (X>Y)
   return multiply(Y,X)
else{
var result = 0;
 for 1 to X
       result +=Y
return result
}
}

Posted: Sat Oct 20, 2007 10:13 pm
by Zifnab
tsilochr wrote:προφανώς τον εξυπηρετεί να μπαίνει ο μικρός πίνακας μπροστά. αν είναι ίσοι του είναι αδιάφορο.
Τhnx :-D ! Όμως δεν αλλάζει την σειρά των πινάκων αφού αυτοι καθορίζονται στο Select, αλλά για ποιον θα κρατάει το ένα στοιχείο και θα γράφει τα στοιχεία του άλλου μέχρι εξαντλήσεως.... Εντάξει κατανοητός ο αλγόριθμος πολλαπλασιασμού αριθμών, αλλά στην συγκεκριμένη περίπτωση ο αλγόριθμος ούτως ή άλλως δεν θα κάνει |Α|*|Β| βήματα για δύο πίνακες Α,Β? Δηλαδή τον βλέπω σαν τον εξής αλγόριθμο- τον γράφω έτσι παρόλο που μπορεί να συμπτυχθεί για να είναι πιο κατανοητός:

Code: Select all

select (A, B){
if (A.size<B.size) {
    for (i:1 to A.size) {
       for(j:1 to B.size) {
        print A[i]+" "+B[j]
        }
   }
}
else if (A.size>B.size) {
    for (j:1 to B.size) {
       for(i:1 to A.size) {
        print A[i]+" "+B[j] 
       }
   }
}
else {
    "Δες τους πίνακες στο FROM"
     if (προηγείται το Α) {
         for (j:1 to B.size) {
            for(i:1 to A.size) {
              print A[i]+" "+B[j]
           }
         }
     }
     else if (προηγείται το B) {
         for (i:1 to A.size) {
            for(j:1 to B.size) {
              print A[i]+" "+B[j]
           }
         }
     }
}

}


Υπάρχει κανένα site που να εξηγεί τις ιδιαιτερότητες των queries όπως αυτή την ειδική μεταχείρηση του SELECT?

Posted: Sun Oct 21, 2007 10:44 am
by tsilochr
Όμως δεν αλλάζει την σειρά των πινάκων αφού αυτοι καθορίζονται στο Select.
όχι, στο select clause δεν καθορίζεις την σειρά των πινάκων. απλά καθορίζεις τι θες να δεις από το αποτελέσμα του υπόλοιπου query (from, where, group, having κλπ).

Posted: Sun Oct 21, 2007 10:57 am
by Zifnab
Εννοούσα τη σειρά των πινάκων ως ποιά στήλη Element θα μπεί πρώτη και ποια δεύτερη (δλδ από ποιανου πίνακα )

Τι έχεις να πεις για τον αλγόριθμο? Βλέπεις κάποιο λόγο optimization σε αυτόν τον τύπο query ??? - εγώ πάντως δεν βλέπω! :shock:

Posted: Sun Oct 21, 2007 11:19 am
by tsilochr
φαντάζομαι ένα dbms δεν θα λειτουργεί τόσο παιδικά. υπάρχουν πολλές άλλες παράμετροι που λαμαβάνονται υπόψην πριν γίνει ένα join.

Posted: Sun Oct 21, 2007 11:25 am
by Zifnab
Ναι φυσικά ο αλγόριθμος είναι παιδικός αφού άρχισα να ψάχνομαι, αργότερα ίσως να ανακαλύψω βαθύτερα τα αίτια τέτοιας συμπεριφοράς. Αλλά απ' ότι φαίνεται δεν υπάρχει site/βιβλίο που να ξεκοκκαλίζει την MS SQL....

Posted: Sun Oct 21, 2007 3:20 pm
by Swtos
Zifnab wrote:Υπάρχει κανένα site που να εξηγεί τις ιδιαιτερότητες των queries όπως αυτή την ειδική μεταχείρηση του SELECT?
Αν εχεις ορεξη ριξε μια ματια σε αυτά:
http://infolab.stanford.edu/~hector/cs245/Notes06.pdf
http://infolab.stanford.edu/~hector/cs245/Notes07.pdf

Εξηγουν πως γινεται η εκετελεση ενός query και με ποια κριτηρια λαμβάνει αποφάσεις ένα DBMS για πετύχει τη βελτιστη εκτελεση του. Επισης το συγκεκριμένο βιβλίο είναι κορυφαίο, αν και λιγο βαρυ ωρες ωρες, αν ενδιαφερεσαι για βασεις και DBMS.

Posted: Sun Oct 21, 2007 3:24 pm
by Zifnab
Swto thnx για τα links ! :-D
Θα τις δώ όσο πιο αναλυτικά μπορώ μόλις περάσω στην εμβάθυνση....
Όταν λες το βιβλίο επειδή δεν εντόπισα τον τίτλο του...εννοείς το textbook του cs245 για το Stanford?

Posted: Sun Oct 21, 2007 4:50 pm
by Swtos
Ναι λεω για το Database Systems: The Complete Book από τους Ηector Garcia-Molina, Jeff Ullman, and Jennifer Widom. Βεβαια καλό θα ηταν να ασχοληθεις με αυτά αν εχεις περάσει το μαθημα του κ.Βασσάλου. Το βιβλίο υπάρχει και στην βιβλιοθήκη μας. Δες και αυτο:

http://infolab.stanford.edu/~ullman/dscb.html

Posted: Sun Oct 21, 2007 5:19 pm
by Zifnab
thnx πολύ Swtos! ;) Βασικά θα προετοιμαστώ από τώρα για να δώσω το μάθημα του κύριου Βασσάλου στο επόμενο εξάμηνο... ;) Γιατί αλλιώς δεν θα προλάβω να το ξαναπαρακολουθήσω με τόσα που χρωστάω... :roll: