sql >> Databáze >  >> RDS >> Sqlserver

Pořadí provádění příkazů SQL Server

Toto je známá "funkce" SQL Server. Nikdy nepředpokládejte, že se klauzule WHERE spustí před klauzulí SELECT.

Viz:SQL Server by měl nevyvolává nelogické chyby

Někdy k tomu skutečně existují dobré důvody. Zvažte spojení dvou stolů, přičemž A je mnohem menší než B.

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

Pokud zkontrolujete vygenerovaný plán dotazů, správně nebo špatně, SQL server bude streamovat data z A jako první řádky, které se spojí s B. Přitom ví, že potřebuje pouze stáhnout col2 a function on col1 . Mohlo by to přinést col1 SQL Server může také transformovat data během procesu streamování, aby bylo možné funkci spustit později, nebo pro něco tak triviálního jako CAST.

Jedna věc je jistá, tato strategie dělá SQL Server o něco rychlejším v určitých dotazech. Ale z čistě logického hlediska bych to nazval bug.



  1. SQL Counter a returner, zdvojnásobí výsledek

  2. Jak Oracle SELECT FROM dual pracuje s více poli

  3. Jaký je limit velikosti pro argument podprogramu varchar2 PL/SQL v Oracle?

  4. PHP nevkládá obsah do databáze mySQL:text, obrázky, cokoliv