Má pořadí výrazy nebo predikáty žádný rozdíl ve stavu Vytvořit vnější spojení ve standardním SQL?

hlasů
2

Takže mám trochu frustrující den. Byl jsem vyhozen ze smlouvy, kterou jsem pracoval v posledních několika týdnech, protože já ne „ze síťoviny s týmem.“ Dva příklady byly citovány:

1) Včera jsem byl požádán, aby odstranit všechna data z databáze SQL Server s výjimkou některých údajů základního systému. Žadatel (není můj šéf) měla asi osm skripty jí použité pro tento úkol před několika měsíci. Zřejmě nikdo nikdy myšlenka skript z datového modelu, nebo systémová data.

Tato osoba založil vzor nadměrně komplikovat věci, takže jsem se snažil pochopit důvody pro danou úlohu a konečný cíl. Také jsem se snažil pochopit, proč se vždycky nejrůznější vágní chyb, které vyžadovaly všechny tyto dodatečné skripty „odebrat a znovu přidat omezení“.

Byl jsem docela ochoten udělat cokoliv, nezbytné a povídali jsme si několik minut o tom. Ze zřejmých důvodů, proč jsem si myslel, že se snaží pochopit, proč byla dobrá věc. Najednou se rozhodl, že to bude jen rychlejší to udělat sama, spíše než trávit čas vysvětlovat to všechno ke mně a já se vrátil do mé další práce, aniž by přemýšlel o tom víc.

Nějak to bylo vykládáno negativně.

2) Před několika týdny během mého prvního týdne jsem byl požádán, aby práce na sloučení některá data z jiného systému. Dostal jsem 600+ řádku skriptu na SQL, úryvků, že všichni vypadal, že je důležité spolu s ústním tirády stížností špatných dat a původních programátorů. Přirozeně to trvalo trochu času prokousat těsně, ale po několika dnech můj konečný výsledek se ukázal jako jednoduchý splynout zhruba 25 linek.

Byl jsem psát SQL pro více než deset let a považuji se mít nějaké zkušenosti v této oblasti. Mí spolupracovníci byli stále trochu netrpělivý, když jsem odloupne vrstev zbytečné složitosti a já jsem zůstal pozdě na to dokončit úkol, jak jsem slíbil.

Nebyl jsem si jistý, jak snadno by se uznat, že řešení problému se zdá být přesně jeden velmi krátký povel a mě napadlo, jestli jsem něco chybí, že by se ukázalo, že je trapné. Bohužel všechny mé zkoumavé otázky byly opakovaně setkal s druhem odmítavý non-odpovědí, které chudé učitelé dávají k přehnaně zvědavý elementární student. Tak jsem poslal dotaz spolu v e-mailu a šel domů.

Druhý den ráno mi bylo řečeno (stejná osoba jako # 1), že to bylo všechno v pořádku, ale je to věc jsem nemohl očekávat, že vím, jak ten nový. Vysvětlila, že se musela ovládnout z přepisování všechno. Jeden z jejích bodů bylo něco menší o údajích, které jsem už určených ji požádat o sobě. Ten druhý byl čistě SQL.

(Tato otázka začíná zde.)

Vezměte typický levý vnější spojení scénář. Všichni víme, že pořadí tabulek je poměrně významné, například Q1 a Q2 nejsou rovnocenné:

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)

Když si vzpomenu koncepčně o násobek připojí obvykle zdá přirozené, že mi představit vyzvednout novou tabulku jako objekt zájmu a pak popisuje, jak jsou jeho řádky souvisí s tím, co to přijde dřív. Udržení podmínek paralelně nemá žádnou výhodu ke mně a mým vlastním zvyku I obecně psát podmínku spojení tímto způsobem:

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

Tak jsem se ocitl právě učil o tom, jak pořadí tabulky záležitostech vnější spojení. Myslel jsem, že tento test mé inteligence již bylo učiněno v průběhu pohovoru. Můj zmatek proměnil strnulosti, když jsem si uvědomila, že se zaměřuje pouze na srovnání mužů a žen. K jejímu Q3 bylo špatně a Q1 byla verze jsem potřeboval místo.

I diplomaticky trval na tom, že to nemělo žádný rozdíl vůbec, a že jsem mohl snadno dokázat, můj případ, kdyby chtěla. Snažil jsem se objasnit její úvahy, ale je to ten typ člověka, který nemá pozorně poslouchat vaše otázky bez ohledu na to, jak pečlivě jsou formulovány nebo kolik technické slova, která používáte navrhnout malý úrovně odborné způsobilosti, tak jsem se rozhodl, že jsem ji nemohl přesvědčit, že nejsem idiot. A souhlasil jsem se změnit scénář, protože nestála dohadovat.

Domnívám se, že není bezprostředně polykání svoji hrdost prokázaly, že jsem nebyl „coachable.“


Co se týče samotného stylu I v souladu s nějakým standardem zaměstnavatel preferuje když jejich SQL je často nedbalý jinými způsoby. Já si uvědomují, že se starým stylu vnějšího spojení syntaxe by to záležitost. Kromě toho jsem nikdy neslyšel, aby tento případ. Prosím odpovězte na tuto otázku a vykoupit svou pověst.

Má pořadí výrazy nebo predikáty žádný rozdíl ve stavu Vytvořit vnější spojení ve standardním SQL?

Položena 07/07/2012 v 01:54
uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
2

Pořadí srovnání rovnosti nezáleží na výsledky spojení. Ale to by mohlo pro nevyzpytatelný důvodů vliv na účinnost, se kterou je výsledek vypočítaný. SQL optimalizaci jsou notoricky známé pro bytí ovlivněn zdánlivě nedůležitých detailů, jako je tento.

Odpovězeno 07/07/2012 v 02:04
zdroj uživatelem

hlasů
4

Ne, na tom nezáleží.

Osobně dávám přednost styl, který vám ukáže ve 3. čtvrtletí, někteří z mých spolupracovníků preferuje styl v Q1. Já neznám nikoho, kdo by někdy zvážit některý z nich bude v pořádku .

Dotaz optimalizátor změní dotaz naruby do něčeho úplně jiného, ​​takže predikát ani neexistuje ve formě prostého srovnání nic víc, když se to dělá s ním. Obvykle se jedná o vyhledávání v indexu nebo tabulky, a jako to může být provedeno pouze v jednom směru, jak bylo napsáno predikát nehraje žádnou roli.

Ověřil jsem si (SQL Server 2005) plán vykonání dvou dotazů s predikátem operandů v jiném pořadí, a jak se očekávalo, že jsou shodné.

Odpovězeno 07/07/2012 v 02:21
zdroj uživatelem

hlasů
2

Raději Q3 je REGISTRACE to stav objednávky příliš:

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

Jak to přímo odráží skutečnost, že B.id je ještě měnící se jedna, můžete si myslet A.id jako testovaný proti konstantní bytosti, např

B.id = 1984

Ve stejném duchu, že nechci vidět v kódu ...

1984 = B.id

... stejně jako vy nechci vidět v dotazu:

A.id = B.id

Nicméně, stejně jako většina věcí v životě, tam jsou lidé, kteří mají rádi little-endian, a tam jsou ti, kteří mají rádi big-endian. Ať už mentální model, to jim může sloužit na preferencích, které si zvolili, měli by být alespoň schopen vysvětlit důvody, proč by chtěliA.id = B.id

Myslím, že musím změnit svůj přednost však má (a svůj) přednostní stav objednávky nefunguje v některých ORM, LINQ zejména. Ještě jsem se pochopit, proč se ukládají, že podmínka by měla být v pořádku Q1 je:

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

A zvrátit stav (stejné jako Q3, ale v dotazu SQL, že není chyba) má za následek, aby se syntaktická chyba, to nebude přijat LINQ:

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

Teď musím najít důvody, proč Microsoft LINQ designéři preferovaného pořadí Q1 podmínka je. A pokusit se ocenit, pokud to má smysl, a jen přijímat iv případě, že není (zatím) dává smysl.


Ohledně:

Má pořadí výrazy nebo predikáty žádný rozdíl ve stavu Vytvořit vnější spojení ve standardním SQL?

Výsledky-moudrý, NO . Výkon-moudrý, musím ještě vidět dotaz, kde je spojit je stav objednávky činí dotaz rychleji. Dokonce i ve fórech jsem neviděl nikoho podporuje zvrátit stav, aby se dotaz rychleji.

Nemohou-li se vysvětlit důvody, nebo mentální model, aby jejich výhodnými podmínka je možné, možná jsou to jen dělá cargo kult programování nebo ještě hůř, Bikeshedding

Odpovězeno 07/07/2012 v 02:48
zdroj uživatelem

hlasů
1

Raději svůj Q1, nicméně to je absolutně žádný rozdíl ve výkonnosti a nemá absolutně žádný vliv na optimalizace dotazů.

Pro mě uvedení předchozí tabulku nejprve mi dává relevantní informace dříve v mém procesu skenování. Umím číst join table B on A ...a už víte, které dvě tabulky jsou spojeny dohromady. Když jsem četl join table B on B.blasdjasdid = ...jsem měl skenovat mnohem dál a stále ještě nevědí, nejdůležitější informace, které tabulky jsou připojeny k (což je jakási názvů, doména, pod kterým bude název sloupce pochopil). Navíc, v případě, že sloupce jsou pojmenovány stejné v obou tabulkách (idiomatických v jakékoli databáze I návrhu), se mohu vyhnout skenování až do konce zcela, pouze čtení join table B on A.SomethingId ...a už věděl, že je to = B.SomethingId.

Chystáte se trochu hlouběji, tak bych vám, abyste se zeptat na tuto událost na workplace.stackexchange.com protože mám podezření, že důvody, vaše služby byly přerušeny se neshodují, co ti řekli; někteří Vyšetřování by to mohlo být produktivní. Netvrdím, že to vaše vina, ale že důvodem byl pravděpodobně záminkou.

Odpovězeno 29/12/2015 v 19:14
zdroj uživatelem

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