sql >> Database teknologi >  >> RDS >> Sqlserver

Eksekverer UNDTAGET hurtigere end en JOIN, når tabelkolonnerne er de samme

Der er ingen måde, nogen kan fortælle dig det EXCEPT vil altid eller aldrig udkonkurrere en tilsvarende OUTER JOIN . Optimizeren vil vælge en passende eksekveringsplan, uanset hvordan du skriver din hensigt.

Når det er sagt, her er min retningslinje:

Brug EXCEPT når mindst én af følgende er sandt:

  1. Forespørgslen er mere læsbar (dette vil næsten altid være sandt).
  2. Ydeevnen er forbedret.

Og BEGGE af følgende er sande:

  1. Forespørgslen producerer semantisk identiske resultater, og du kan demonstrere dette gennem tilstrækkelig regressionstest, inklusive alle kanttilfælde.
  2. Ydeevnen forringes ikke (igen, i alle edge-tilfælde, såvel som miljøændringer, såsom rydning af bufferpuljen, opdatering af statistik, rydning af planens cache og genstart af tjenesten).

Det er vigtigt at bemærke, at det kan være en udfordring at skrive en tilsvarende EXCEPT forespørgsel som JOIN bliver mere kompleks, og/eller du er afhængig af dubletter i en del af kolonnerne, men ikke andre. At skrive en FINDER IKKE tilsvarende, mens den er lidt mindre læsbar end EXCEPT burde være langt mere trivielt at opnå - og vil ofte føre til en bedre plan (men bemærk, at jeg aldrig ville sige ALTID eller ALDRIG , undtagen på den måde, jeg lige gjorde).

I dette blogindlæg demonstrerer jeg mindst ét ​​tilfælde, hvor EXCEPT er bedre end både en korrekt konstrueret LEFT OUTER JOIN og selvfølgelig af en tilsvarende EKSISTERER IKKE variation.



  1. PostgreSQL vs. MySQL:Hvilken er bedst?

  2. MySQL:Opdel kommasepareret liste i flere rækker

  3. SQL Server BIT Datatype – Ultimativ guide

  4. Hvad er SQL, og hvordan kommer man i gang med det?