
Έτσι, είμαι έχοντας ένα κομμάτι από ένα απογοητευτικό ημέρα. I απολύθηκε από τη σύμβαση που είχε εργαστεί τις τελευταίες εβδομάδες, επειδή δεν είχα «πλέγμα με την ομάδα.» Δύο παραδείγματα αναφέρθηκαν:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


**1)** Χθες μου ζητήθηκε να διαγράψετε όλα τα δεδομένα από μια βάση δεδομένων του SQL Server με εξαίρεση ορισμένες βασικά δεδομένα του συστήματος. Ο αιτών (δεν το αφεντικό μου) είχε περίπου οκτώ σενάρια που είχε χρησιμοποιηθεί για το έργο αυτό πριν από λίγους μήνες. Προφανώς κανείς δεν έχει σκεφτεί ποτέ να το σενάριο από το μοντέλο δεδομένων ή τα δεδομένα του συστήματος.


Αυτό το άτομο είχε καθιερώσει ένα μοτίβο πάνω-περιπλέκει τα πράγματα, γι 'αυτό προσπαθεί να κατανοήσει τους λόγους για την εργασία και τον τελικό στόχο. Αγωνίστηκα επίσης να καταλάβω γιατί πήρε πάντα όλα τα είδη των αόριστες λάθη που απαιτούνται όλα αυτά τα επιπλέον σενάρια για την «απομάκρυνση και την εκ νέου προσθέσετε περιορισμούς».


Ήμουν πολύ πρόθυμος να κάνει οτιδήποτε είναι αναγκαίο και μιλήσαμε για αρκετά λεπτά γι 'αυτό. Για προφανείς λόγους σκέφτηκα ότι προσπαθούν να καταλάβουν γιατί ήταν ένα καλό πράγμα. Ξαφνικά αποφάσισε ότι θα ήταν απλά πιο γρήγορα για να το κάνει ο ίδιος αντί να ξοδεύουν το χρόνο που εξηγεί τα πάντα για μένα και πήγα πίσω σε άλλους τη δουλειά μου χωρίς να σκεφτόμαστε περισσότερο γι 'αυτό.


Κάπως αυτό ερμηνεύθηκε αρνητικά.


**2)** Πριν από μερικές εβδομάδες κατά την πρώτη εβδομάδα μου ζητήθηκε να εργαστούν για τη συγχώνευση κάποια δεδομένα από ένα άλλο σύστημα. Μου δόθηκε μια 600+ γραμμή σενάριο της δημιουργίας ενός SQL που όλα φαίνεται να είναι σημαντική, μαζί με από του στόματος υβρεολόγιο των καταγγελιών για κακή δεδομένα και τις αρχικές προγραμματιστές. Φυσικά πήρε λίγο χρόνο να εντρυφήσω μέσα από στενά, αλλά μετά από λίγες μέρες τελικό μου αποτέλεσμα αναδειχθεί ως μια απλή συγχώνευση περίπου 25 γραμμές.


Έχω γράψει SQL για περισσότερα από δέκα χρόνια και θεωρώ τον εαυτό μου να έχει κάποια εμπειρία στην περιοχή. οι συνεργάτες μου ήταν να πάρει λίγο ανυπόμονοι όπως εγώ φλούδα μακριά τα στρώματα της περιττής πολυπλοκότητας και έμεινα αργά για να τελειώσει το έργο, όπως είχε υποσχεθεί.


Δεν ήμουν σίγουρος πόσο εύκολα θα δέχονταν ότι η λύση του προβλήματος φαίνεται να είναι ακριβώς ένα πολύ σύντομο εντολή και αναρωτήθηκα αν ήμουν λείπει κάτι που θα αποδειχθεί ότι είναι ενοχλητικό. Δυστυχώς όλα διερευνητικές ερωτήσεις μου είχε κατ 'επανάληψη συναντήθηκε με το είδος της περιφρονητική μη απαντήσεις που φτωχών δάσκαλοι δίνουν σε μια υπερβολικά περίεργος αρχάριος μαθητής. Γι 'αυτό και έστειλε το ερώτημα κατά μήκος σε ένα μήνυμα ηλεκτρονικού ταχυδρομείου και πήγε σπίτι του.


Το επόμενο πρωί μου είπαν (ίδιο πρόσωπο με # 1), ότι ήταν όλα λάθος, αλλά ήταν πράγματα που δεν θα μπορούσε να αναμένεται να γνωρίζετε ως νέος άνθρωπος. Εξήγησε ότι έπρεπε να τον εαυτό απέχουν από το ξαναγράψιμο όλα. Ένα από τα σημεία της ήταν κάτι ήσσονος σημασίας σχετικά με τα δεδομένα που είχα ήδη προορίζονται να τη ρωτήσω για τον εαυτό μου. Η άλλη ήταν καθαρά SQL.


### (Η ερώτηση ξεκινά εδώ.)


Πάρτε ένα τυπικό αριστερό εξωτερικό σύνδεσμο σενάριο. Όλοι γνωρίζουμε ότι η σειρά των πινάκων είναι αρκετά σημαντική, π.χ., **Q1** και **Q2** δεν είναι ισοδύναμες:



```
SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON A.id = B.id -- (Q1)
SELECT A.x, B.y FROM B LEFT OUTER JOIN A ON B.id = A.id -- (Q2)

```

Όταν σκέφτομαι εννοιολογικά για πολλαπλές ενώνει συνήθως φαίνεται φυσικό για μένα να φανταστώ να πάρει το νέο πίνακα με το αντικείμενο του ενδιαφέροντος και στη συνέχεια περιγράφει πώς οι σειρές του σχετικά με το τι έρθει πριν. Κρατώντας τους όρους παράλληλα δεν έχει κανένα πλεονέκτημα για μένα και από τη δική μου συνήθεια Εγώ γενικά γράψω την συνθήκη συνένωσης με αυτόν τον τρόπο:



```
SELECT A.x, B.y FROM A LEFT OUTER JOIN B ON B.id = A.id -- (Q3)

```

Έτσι, θεωρώ τον εαυτό μου που δίδαξε σχετικά με το πώς η σειρά των πινάκων θέματα σε εξωτερικό σύνδεσμο. Είχα σκεφτεί αυτό το τεστ νοημοσύνης μου έχει ήδη γίνει κατά τη διάρκεια της συνέντευξης εργασίας. Σύγχυση μου μετατράπηκε σε λήθαργο και συνειδητοποίησα ότι ήταν εστιάζει μόνο στη σύγκριση ισότητας. Για την **Q3** ήταν λάθος και **Q1** ήταν η έκδοση που χρειαζόμουν αντ 'αυτού.


Έχω διπλωματικά επέμεινε ότι δεν κάνει καμία διαφορά καθόλου και ότι θα μπορούσε εύκολα να αποδείξει την υπόθεσή μου, αν ήθελε. Προσπάθησα να αποσαφηνίσει το σκεπτικό της, αλλά αυτό είναι το είδος του ατόμου που δεν ακούει προσεκτικά στις ερωτήσεις σας, ανεξάρτητα από το πόσο προσεκτικά αυτά διατυπώνονται ή πόσες τεχνικές λέξεις που χρησιμοποιείτε για να προτείνουμε ένα μικρό επίπεδο ικανότητας, γι 'αυτό αποφάσισα ότι απλά δεν μπορούσε να την πείσει ότι δεν είμαι ηλίθιος. Και εγώ συμφώνησε να αλλάξει το σενάριο, γιατί δεν άξιζε το επιχείρημα σχετικά.


Υποθέτω ότι δεν είναι άμεσα κατάποση υπερηφάνεια μου έδειξε ότι δεν ήμουν «coachable.»




---


Καθώς μόνο για το στυλ, που ανταποκρίνεται σε κανένα πρότυπο, ο εργοδότης προτιμά όμως SQL τους είναι συχνά προχειρότητα με άλλους τρόπους. Κάνω αναγνωρίζουν ότι με το παλιό στυλ εξωτερικό σύνδεσμο σύνταξη αυτή θα είχε σημασία. Από εκεί και πέρα ​​δεν έχω ακούσει ποτέ κανέναν να κάνει αυτή την υπόθεση. Παρακαλείστε να απαντήσει σε αυτήν την ερώτηση και να εξαργυρώσουν τη φήμη μου.


*Μήπως η σειρά των εκφράσεων ή κατηγορήματα κάνει καμία διαφορά στην κατάσταση ενταχθούν για το εξωτερικό ενώνει το πρότυπο SQL;*

 
Μήπως η σειρά των εκφράσεων ή κατηγορήματα κάνει καμία διαφορά στην κατάσταση ενταχθούν για το εξωτερικό ενώνει το πρότυπο SQL;
===============================================================================================================================



Όχι, δεν κάνει καμία διαφορά.


Προσωπικά προτιμώ το στυλ που σας δείχνουν στο Q3, μερικοί από τους συναδέλφους μου προτιμούν το στυλ στο Q1. Δεν ξέρω κανέναν που θα εξετάσει ποτέ ούτε από αυτούς να είναι *λάθος* .


Η Optimiser ερώτημα μετατρέπει το ερώτημα μέσα προς τα έξω σε κάτι εντελώς διαφορετικό, οπότε το κατηγόρημα δεν υπάρχει καν σαν μια απλή σύγκριση πια, όταν έχει κάνει με αυτό. Συνήθως πρόκειται για μια αναζήτηση σε ένα ευρετήριο ή έναν πίνακα, και όπως αυτό μπορεί να γίνει μόνο προς μία κατεύθυνση, πως το κατηγόρημα γράφτηκε δεν κάνει καμία διαφορά.


Έλεγξα (SQL Server 2005) στο σχέδιο εκτέλεσης των δύο ερωτήματα με τα τελούμενα κατηγόρημα με διαφορετική σειρά, και όπως αναμένεται να είναι πανομοιότυπα.

 

Η σειρά της σύγκρισης ισότητας δεν κάνει καμία διαφορά στα αποτελέσματα της συνένωσης. Αλλά θα μπορούσε για μυστηριώδης λόγους να επηρεάσει την αποτελεσματικότητα με την οποία υπολογίζεται το αποτέλεσμα. βελτιστοποίηση SQL είναι διαβόητη για να επηρεαστεί από φαινομενικά ασήμαντες λεπτομέρειες, όπως αυτό.

 

Προτιμώ Q3 είναι JOIN του προκειμένου κατάσταση πάρα πολύ:



```
... ON B.id = A.id -- (Q3)

```

Όπως αντανακλά ευθέως ότι η B.id είναι η πιο ποικίλες ένα, μπορείτε να σκεφτείτε A.id ως σταθερή υπό δοκιμή κατά, π.χ.



```
B.id = 1984

```

Στο ίδιο πνεύμα ότι δεν θέλω να δω αυτό τον κωδικό ...



```
1984 = B.id

```

..., όπως και εσείς δεν θέλω να δω αυτό το ερώτημα: 



```
A.id = B.id

```

Ωστόσο, όπως και τα περισσότερα πράγματα στη ζωή, υπάρχουν άνθρωποι που τους αρέσει λίγο-endian, και υπάρχουν και εκείνοι που τους αρέσει big-endian. Ό, τι νοητικό μοντέλο αυτό μπορεί να χρησιμεύσει για την προτίμηση που έχετε επιλέξει, θα πρέπει να είναι τουλάχιστον σε θέση να σας εξηγήσω το σκεπτικό γιατί ήθελαν`A.id = B.id`


Νομίζω, έχω να αλλάξετε τις προτιμήσεις μου, όμως, μου (και σας) προτιμάται ώστε κατάσταση δεν λειτουργεί σε κάποια ORM, Linq ειδικότερα. Έχω ακόμα να κατανοήσουν γιατί επιβάλλει ότι η κατάσταση θα πρέπει να είναι για Q1 είναι:



```
from x in A
join y in B on x.id equals y.id

```

Και αντιστροφή της κατάστασης (ίδιο με το 3ο τρίμηνο, αν και στο ερώτημα SQL δεν είναι λάθος) τα αποτελέσματα προκειμένου να συντακτικό λάθος, αυτό δεν θα γίνει αποδεκτή από Linq:



```
from x in A
join y in B on y.id equals x.id

```

Τώρα, έχω να βρείτε το σκεπτικό γιατί η Microsoft Linq σχεδιαστές προτιμάται ώστε η κατάσταση Q1 του. Και προσπαθήστε να το εκτιμήσουν αν έχει νόημα, και μόλις δεχθεί ακόμη δεν έχει (ακόμη) έχει νόημα.




---


Σχετικά με:



> 
> Μήπως η σειρά των εκφράσεων ή κατηγορήματα κάνει καμία διαφορά στην κατάσταση ενταχθούν για το εξωτερικό ενώνει το πρότυπο SQL;
> 
> 
> 


Αποτελέσματα-σοφός, **ΟΧΙ** . Απόδοση-σοφός, έχω ακόμα να δούμε ένα ερώτημα στο οποίο η ένταξη της τάξης κατάσταση καθιστά το ερώτημα γρηγορότερα. Ακόμα και στο φόρουμ δεν έχω δει κανέναν συμφωνεί με την αντιστροφή της κατάστασης για να κάνει το ερώτημα γρηγορότερα.


Εάν δεν μπορούν να σας εξηγήσει το σκεπτικό ή το νοητικό μοντέλο της παραγγελίας προτιμώμενη κατάσταση τους εξυπηρετεί, ίσως είναι ακριβώς να κάνει [Cargo Cult προγραμματισμού](https://en.wikipedia.org/wiki/Cargo_cult_programming) ή ακόμα χειρότερα, [Bikeshedding](https://en.wikipedia.org/wiki/Parkinson%27s_Law_of_Triviality)

 

Προτιμώ Q1 σας, ωστόσο, κάνει *απολύτως καμία διαφορά* στην απόδοση και δεν έχει απολύτως καμία επίδραση στην βελτιστοποίηση ερωτήματος.


Για μένα, βάζοντας πρώτα το προηγούμενο πίνακα μου δίνει τις σχετικές πληροφορίες νωρίτερα στη διαδικασία σάρωσης μου. Μπορώ να διαβάσω `join table B on A ...`και ήδη γνωρίζουμε ποια δύο πίνακες που συνδέονται μεταξύ τους. Όταν διάβασα `join table B on B.blasdjasdid = ...`είχα να ανιχνεύσει πολύ μακρύτερα και ακόμα δεν γνωρίζουμε τις πιο σημαντικές πληροφορίες, οι οποίες πίνακας που συνδέεται με (το οποίο είναι ένα είδος ονομάτων, ένας τομέας υπό τις οποίες θα γίνει κατανοητό το όνομα της στήλης). Επιπλέον, εάν οι στήλες ονομάζονται το ίδιο και στους δύο πίνακες (ιδιωματικές σε κάθε σχεδιασμό βάσεων δεδομένων Ι), μπορώ να αποφύγει τη σάρωση μέχρι το τέλος εξ ολοκλήρου, την ανάγνωση μόνο `join table B on A.SomethingId ...`και ήδη γνωρίζοντας ότι είναι `= B.SomethingId`.


Πηγαίνοντας λίγο βαθύτερα, θα ήθελα να σας ενθαρρύνω να ρωτήσω κάτι σχετικά με αυτό το περιστατικό για [workplace.stackexchange.com](https://workplace.stackexchange.com) γιατί υποψιάζομαι ότι οι λόγοι υπηρεσίες σας διακόπηκαν δεν ταιριάζουν με αυτά που σας είπε? κάποια έρευνα για αυτό θα μπορούσε να είναι παραγωγικοί. Δεν είμαι γεγονός που υποδηλώνει ότι ήταν δικό σου λάθος, αλλά ότι ο λόγος που δόθηκε ήταν πιθανό ένα πρόσχημα.

 