Are ordinea de expresii sau predicate face nici o diferență în condiție se alăture pentru exterior se alătură în SQL standard?

voturi
2

Așa că am un pic de o zi frustrant. Am fost concediat dintr-un contract am fost de lucru în ultimele câteva săptămâni, pentru că nu am „angrena cu echipa.“ Două exemple au fost citate:

1) Ieri am fost rugat să ștergeți toate datele dintr - o bază de date SQL Server , cu excepția unor date de sistem de referință. Solicitantul (nu șeful meu) a avut aproximativ opt script - uri ea a folosit pentru această sarcină în urmă cu câteva luni. Se pare că nimeni nu a gândit vreodată la script din modelul de date sau datele de sistem.

Această persoană a stabilit un model de supra-complica lucrurile, așa că am încercat să înțeleagă motivele pentru sarcina și scopul final. De asemenea, am luptat pentru a înțelege de ce ea a primit mereu tot felul de erori vagi care au necesitat toate aceste script-uri suplimentare pentru a „elimina și re-adăuga constrângeri“.

Am fost destul de dispus să facă orice este necesar și am vorbit timp de câteva minute despre asta. Din motive evidente, m-am gândit că încercarea de a înțelege de ce a fost un lucru bun. Dintr-o dată ea a decis că ar fi pur și simplu mai rapid să o facă ea însăși, mai degrabă decât petrece timp explicând totul pentru mine și m-am dus înapoi la alte munca mea fără să mă gândesc mai mult la asta.

Într-un fel acest lucru a fost interpretat în mod negativ.

2) În urmă cu câteva săptămâni , în prima săptămână am fost rugat să lucreze la fuzionarea unor date dintr - un alt sistem. Am fost dat un script 600+ linie de fragmente SQL care toate păreau să fie importante , împreună cu o tirada orală de plângeri cu privire la datele slabe și programatori originale. În mod firesc a fost nevoie de un pic de timp pentru a Wade prin îndeaproape , dar după câteva zile rezultatul meu final a apărut ca un simplu scufundați în aproximativ 25 de linii.

Am scris SQL pentru mai mult de zece ani și mă consider a avea unele expertiză în zonă. Colegii mei au fost obtinerea un pic nerabdator ca am cojit departe straturile de complexitate inutile și am stat până târziu pentru a termina sarcina cum a promis.

Nu eram sigur cum s-ar accepta cu ușurință că soluția problemei părea să fie exact o singură comandă foarte scurt și m-am întrebat dacă am fost lipsește ceva care ar dovedi a fi jenant. Din păcate, toate întrebările mele au fost îndeplinite de sondare în mod repetat, cu un fel de non-răspunsuri dismissive că profesorii săraci dau la un elev elementar prea curios. Așa că am trimis interogarea de-a lungul într-un e-mail și a plecat acasă.

În dimineața următoare, mi sa spus (aceeași persoană # 1) că a fost greșit, dar a fost lucruri nu am putut fi de așteptat să știe ca nou tip. Ea a explicat că ea a trebuit să se abțină de la rescrierea totul. Unul dintre punctele ei a fost ceva minor cu privire la datele pe care am avut intenția deja să o întrebe despre mine. Celălalt a fost pur SQL.

(Întrebarea începe aici.)

Ia un exterior tipic din stânga se alăture scenariu. Știm cu toții că ordinea tabelelor este destul de semnificativ, de exemplu, Q1 și Q2 nu sunt echivalente:

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)

Când mă gândesc conceptual despre multiple se alătură, de obicei, se pare firesc să-mi imaginez ridicarea noului tabel ca obiect de interes și apoi să descrie modul în care rândurile sale sunt legate de ceea ce a venit înainte. Păstrarea termenilor în paralel nu are nici un avantaj pentru mine și prin propria mea obiceiul să scriu, în general, condiția se alăture în acest fel:

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

Așa că mă găsesc a fi îndrumat despre modul în care ordinea de tabele probleme într - un exterior alătura. Am crezut că acest test de inteligenta mea a fost deja făcut în timpul interviului de locuri de muncă. Confuzia mea sa transformat în stupoare ca am dat seama că a fost concentrându - se doar pe compararea egalității. Pentru ei Q3 a fost greșit și Q1 a fost versiunea am nevoie în schimb.

Am insistat pe cale diplomatică, că nu a făcut nici o diferență, la toate și că am putut dovedi cu ușurință cazul meu, dacă ar fi vrut. Am încercat să clarifice raționamentul ei, dar acest lucru este genul de persoană care nu ascultă cu atenție la întrebările dvs., indiferent de modul în care acestea sunt atent formulate sau cât de multe cuvinte tehnice pe care le utilizați pentru a sugera un nivel mic de competență, așa că am decis că eu doar nu-i putea convinge că nu sunt un idiot. Și am fost de acord să se schimbe script-ul, pentru că nu a fost în valoare de ceartă.

Presupun că nu imediat înghițirea mândria mea a demonstrat că nu am fost „antrenabili.“


În ceea ce privește stilul singur, eu sunt conforme cu orice standard angajator preferă, deși SQL lor este adesea neglijent în alte moduri. Eu recunosc că, odată cu stilul vechi de exterior alătura sintaxa acest lucru ar conta. Dincolo de faptul că n-am mai auzit cineva face acest caz. Vă rugăm să răspundeți la această întrebare și valorificați reputația mea.

Are ordinea de expresii sau predicate face nici o diferență în condiție se alăture pentru exterior se alătură în SQL standard?

Întrebat 07/07/2012 la 01:54
de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
2

Ordinea comparației egalității nu face nici o diferență față de rezultatele join. Dar s-ar putea, din motive de nepătruns afectează eficiența cu care este calculat rezultatul. Optimizările SQL sunt cunoscute pentru a fi afectate de detalii aparent neimportante ca aceasta.

Publicat 07/07/2012 la 02:04
sursa de către utilizator

voturi
4

Nu, nu face nici o diferență.

Personal prefer stilul pe care le arată în Q3, unele dintre colegii mei prefera stilul in T1. Nu cunosc pe nimeni care ar lua în considerare vreodată vreunul dintre ei să fie greșit .

Optimiser interogare transformă interogarea pe dos în ceva complet diferit, astfel încât predicatul nici măcar nu există ca o comparație mai simplu atunci când se face cu ea. De obicei, este o căutare într-un index sau un tabel, și după cum că se poate face numai într-o singură direcție, modul în care predicatul a fost scris nu face nici o diferență.

Am verificat (în SQL Server 2005), planul de execuție a două interogări cu operanzii predicate în ordine diferite, și cum era de așteptat acestea sunt identice.

Publicat 07/07/2012 la 02:21
sursa de către utilizator

voturi
2

Prefer Q3 alăturăm comenzii condiție prea:

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

După cum se reflectă în mod direct că B.id este cel mai variate, vă puteți gândi la A.id ca fiind constantă testată împotriva, de exemplu,

B.id = 1984

În aceeași ordine de idei pe care nu vreau să văd acest lucru în codul ...

1984 = B.id

..., ca tine nu vreau să văd acest lucru în interogare:

A.id = B.id

Cu toate acestea, la fel ca cele mai multe lucruri în viață, există oameni cărora le place little-endian, și sunt cei cărora le place big-endian. Oricare ar fi model mental poate le servi pe preferința ei au ales, acestea ar trebui să fie cel puțin în măsură să vă explice raționamentul de ce au vrutA.id = B.id

Cred că, trebuie să își schimbe preferințele mele, deși, mea (și dumneavoastră) a preferat ordine condiție nu funcționează în unele ORM, LINQ, în special. Trebuie încă să înțeleagă de ce impun ca condiția să fie în ordine Q1 lui:

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

Și inversarea stării (la fel ca și Q3, deși în interogarea SQL nu este o eroare) rezultatele pentru a eroare de sintaxă, acest lucru nu va fi acceptată de Linq:

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

Acum, trebuie să găsească raționamentul de ce designerii Microsoft LINQ preferat, pentru starea lui Q1. Și să încerce să-l aprecieze dacă are sens, și doar să accepte chiar nu (încă) are sens.


In ceea ce priveste:

Are ordinea de expresii sau predicate face nici o diferență în condiție se alăture pentru exterior se alătură în SQL standard?

Rezultate atotînțelepte, NO . Performanță înțelept, am încă pentru a vedea o interogare în cazul în care join de comandă condiție face interogarea mai repede. Chiar și în forumuri nu am văzut pe nimeni susține inversând condiția de a face interogarea mai repede.

Dacă ei nu pot explica raționamentul sau modelul mental al ordinea stării lor preferată servește preparate, probabil , ei fac doar Cargo Cult de programare sau , mai rău încă, Bikeshedding

Publicat 07/07/2012 la 02:48
sursa de către utilizator

voturi
1

Prefer Q1 dvs., cu toate acestea se face absolut nici o diferenta in performanta si nu are absolut nici un efect asupra optimizatorul de interogare.

Pentru mine, punând mai întâi tabelul anterior îmi dă informațiile relevante mai devreme în procesul meu de scanare. Pot citi join table B on A ...și deja știu care două tabele sunt unite. Când am citit join table B on B.blasdjasdid = ...am avut pentru a scana mult mai departe și încă nu știu cele mai importante informații, care de masă este unit la (care este un fel de spațiu de nume, un domeniu sub care numele coloanei va fi înțeles). În plus, în cazul în care coloanele sunt denumite aceleași în ambele tabele (idiomatice în orice design bază de date I), pot evita scanarea la sfârșitul anului în întregime, citind doar join table B on A.SomethingId ...și știind deja că este = B.SomethingId.

Mergând un pic mai profund, aș încuraja să întreb despre acest eveniment pe workplace.stackexchange.com pentru că bănuiesc că motivele pentru serviciile dvs. au fost întrerupte nu se potrivesc cu ceea ce ți - au spus; unele anchetă în acest lucru ar putea fi productiv. Nu sugerez că a fost vina ta, dar că motivul invocat a fost probabil un pretext.

Publicat 29/12/2015 la 19:14
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more