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

Je MS-SQL AND/OR podmíněné (provést vyhodnocení zkratu)?

Neexistuje žádná záruka tohoto chování.

Příklad vyhodnocení zkratu ne děje s expr1 AND expr2 je

SET STATISTICS IO ON

IF EXISTS(SELECT COUNT(*) FROM master..spt_monitor HAVING COUNT(*)=2)  
AND EXISTS (SELECT COUNT(*) FROM master..spt_values HAVING COUNT(*)=1)
PRINT 'Y'

EXISTS(SELECT COUNT(*) FROM master..spt_monitor HAVING COUNT(*)=2) je false (což znamená And -ed výraz musí být False ), ale výsledky IO ukazují, že druhá podmínka byla stále vyhodnocena.

Table 'spt_values'. Scan count 1, logical reads 14, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'spt_monitor'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server může přesto udělejte toto. Vidím to ve svém testu

SET STATISTICS IO ON

DECLARE @p1 BIT = NULL

IF ( @p1 = 1
     AND EXISTS(SELECT *
                FROM   master..spt_values) )
  PRINT '1'

ELSE IF ( @p1 = 0
     AND EXISTS(SELECT *
                FROM   master..spt_values) )
  PRINT '2'

Výstup je

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

Zobrazují se spt_values nebyl nikdy použit.

To je implementováno pomocí predikátové podmínky průchodu v prováděcím plánu. Zde jsou o nich nějaké informace.

Pokud je passthrupredikát vyhodnocen jako true, spojení vrátí řádek... Pokud je passthrupredikát vyhodnocen jako false, spojení pokračuje normálně



  1. MySQL Performance Cheat Sheet

  2. Jak mohu vybrat první den v měsíci v SQL?

  3. Jak chránit databáze MySQL před ransomwarovými kampaněmi

  4. 5 způsobů aktualizace dat pomocí dílčího dotazu v Oracle SQL