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

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

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

Post by Zifnab » Sat Oct 20, 2007 11:57 am

Καθόμουν και έπαιζα με τα εισαγωγικά της 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 και επιπλέον όταν κάποιοι απο αυτούς είναι ισομεγέθεις ή άδειοι....
Last edited by Zifnab on Sun Oct 21, 2007 2:08 am, edited 1 time in total.
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Sat Oct 20, 2007 12:23 pm

σε προβληματίζει η ταξινόμηση των πλειάδων που έκανε ανάλογα με το γινόμενο πινάκων στο from clause? Δεν μου φαίνεται για παραξενιά όσο για speed optimizing. Βάζει το μικρότερο πίνακα μπροστά για να κάνει μάλλον πιο γρήγορα το πολλαπλασιασμό
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sat Oct 20, 2007 12:28 pm

Ναι αλλά θα περίμενα να μην τα κάνει 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
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Sat Oct 20, 2007 12:34 pm

προφανώς τον εξυπηρετεί να μπαίνει ο μικρός πίνακας μπροστά. αν είναι ίσοι του είναι αδιάφορο.

Σκέψου ένα απλό αλγόριθμο για πολλαπλασιασμό 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
}
}
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sat Oct 20, 2007 10:13 pm

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?
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Sun Oct 21, 2007 10:44 am

Όμως δεν αλλάζει την σειρά των πινάκων αφού αυτοι καθορίζονται στο Select.
όχι, στο select clause δεν καθορίζεις την σειρά των πινάκων. απλά καθορίζεις τι θες να δεις από το αποτελέσμα του υπόλοιπου query (from, where, group, having κλπ).
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sun Oct 21, 2007 10:57 am

Εννοούσα τη σειρά των πινάκων ως ποιά στήλη Element θα μπεί πρώτη και ποια δεύτερη (δλδ από ποιανου πίνακα )

Τι έχεις να πεις για τον αλγόριθμο? Βλέπεις κάποιο λόγο optimization σε αυτόν τον τύπο query ??? - εγώ πάντως δεν βλέπω! :shock:
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Sun Oct 21, 2007 11:19 am

φαντάζομαι ένα dbms δεν θα λειτουργεί τόσο παιδικά. υπάρχουν πολλές άλλες παράμετροι που λαμαβάνονται υπόψην πριν γίνει ένα join.
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sun Oct 21, 2007 11:25 am

Ναι φυσικά ο αλγόριθμος είναι παιδικός αφού άρχισα να ψάχνομαι, αργότερα ίσως να ανακαλύψω βαθύτερα τα αίτια τέτοιας συμπεριφοράς. Αλλά απ' ότι φαίνεται δεν υπάρχει site/βιβλίο που να ξεκοκκαλίζει την MS SQL....
User avatar
Swtos
Kilobyte level
Kilobyte level
Posts: 309
Joined: Mon Apr 18, 2005 4:52 pm
Academic status: MSc
Gender:
Location: Δ.Π

Post by Swtos » Sun Oct 21, 2007 3:20 pm

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

Εξηγουν πως γινεται η εκετελεση ενός query και με ποια κριτηρια λαμβάνει αποφάσεις ένα DBMS για πετύχει τη βελτιστη εκτελεση του. Επισης το συγκεκριμένο βιβλίο είναι κορυφαίο, αν και λιγο βαρυ ωρες ωρες, αν ενδιαφερεσαι για βασεις και DBMS.
-My father made him an offer he couldnt refuse
-What was that?
-Luca Brasi held a gun to his head and my father assured him that either his brain or his signature would be on the contract

-The Godfather
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sun Oct 21, 2007 3:24 pm

Swto thnx για τα links ! :-D
Θα τις δώ όσο πιο αναλυτικά μπορώ μόλις περάσω στην εμβάθυνση....
Όταν λες το βιβλίο επειδή δεν εντόπισα τον τίτλο του...εννοείς το textbook του cs245 για το Stanford?
User avatar
Swtos
Kilobyte level
Kilobyte level
Posts: 309
Joined: Mon Apr 18, 2005 4:52 pm
Academic status: MSc
Gender:
Location: Δ.Π

Post by Swtos » Sun Oct 21, 2007 4:50 pm

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

http://infolab.stanford.edu/~ullman/dscb.html
-My father made him an offer he couldnt refuse
-What was that?
-Luca Brasi held a gun to his head and my father assured him that either his brain or his signature would be on the contract

-The Godfather
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Post by Zifnab » Sun Oct 21, 2007 5:19 pm

thnx πολύ Swtos! ;) Βασικά θα προετοιμαστώ από τώρα για να δώσω το μάθημα του κύριου Βασσάλου στο επόμενο εξάμηνο... ;) Γιατί αλλιώς δεν θα προλάβω να το ξαναπαρακολουθήσω με τόσα που χρωστάω... :roll:
Post Reply

Return to “Προγραμματισμός”