sql >> Databasteknik >  >> RDS >> Sqlserver

Ordningsföljd för körning av SQL Server-satser

Detta är en känd "funktion" i SQL Server. Anta aldrig att WHERE-satsen körs före SELECT-satsen.

Se:SQL Server bör inte ta upp ologiska fel

Det finns faktiskt goda skäl att göra det ibland. Överväg att slå samman två tabeller, där A är mycket mindre än B.

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

Om du inspekterar frågeplanen som genererats, med rätta eller fel, kommer SQL-servern att strömma data från A som de ledande raderna för att sammanfoga mot B. Medan den gör det vet den att den bara behöver dra col2 och function on col1 . Det kan ge col1 genom att bara köra funktionen senare, eller för något så trivialt som CAST, kan SQL Server lika gärna transformera data under streamingprocessen.

En sak är säker, den här strategin gör SQL Server lite snabbare i vissa frågor. Men ur ett rent logiskt perspektiv skulle jag kalla det en bugg.



  1. ORA-01027:bindningsvariabler är inte tillåtna för datadefinition när man försöker använda if elseif

  2. MySQL GROUP BY DateTime +/- 3 sekunder

  3. Behöver hjälp med att installera MySQL för Python

  4. Hur man kör bash-kommandot under omdirigering <<EOF