sql >> Database >  >> RDS >> Sqlserver

Volgorde van uitvoering van SQL Server-instructies

Dit is een bekende "functie" van SQL Server. Ga er nooit vanuit dat de WHERE-component wordt uitgevoerd vóór de SELECT-component.

Zie:SQL Server moet maak geen onlogische fouten

Er zijn eigenlijk goede redenen om dat soms te doen. Overweeg om twee tabellen samen te voegen, waarbij A veel kleiner is dan B.

select CAST(A.col1 as int), A.col2, B.col3
from A join B ...
where ... isnumeric(A.col1) = 1

Als u het gegenereerde queryplan inspecteert, terecht of onterecht, zal SQL-server de gegevens van A streamen als de leidende rijen om samen te voegen met B. Terwijl hij dat doet, weet hij dat hij alleen col2 hoeft te halen en function on col1 . Het kan col1 . opleveren om de functie later uit te voeren, of voor zoiets triviaals als CAST, kan SQL Server net zo goed de gegevens transformeren tijdens het streamingproces.

Eén ding is zeker, deze strategie maakt SQL Server een beetje sneller in bepaalde queries. Maar vanuit een puur logisch perspectief zou ik het een bug noemen.



  1. Automatisch verhogen na verwijderen in MySQL

  2. Refactor-functies zodat ze kunnen worden gebruikt binnen een CTE

  3. Gebruik TYPE_ID() om de ID van een gegevenstype in SQL Server op te halen

  4. Hoe zijn de SQL-commando's geclassificeerd | UBIQ