Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ist MS-SQL UND/ODER bedingt (Kurzschlussauswertung durchführen)?

Es gibt keine Garantie für dieses Verhalten.

Ein Beispiel für die Kurzschlussauswertung nicht geschieht mit expr1 AND expr2 ist

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'

Der EXISTS(SELECT COUNT(*) FROM master..spt_monitor HAVING COUNT(*)=2) ist false (bedeutet das And -ed-Ausdruck muss False sein ), aber die IO-Ergebnisse zeigen, dass die zweite Bedingung noch ausgewertet wurde.

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 kann mach das doch. Ich sehe das in meinem Test

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'

Die Ausgabe ist

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)

spt_values werden angezeigt wurde nie zugegriffen.

Dies wird durch eine Pass-Through-Prädikatbedingung im Ausführungsplan implementiert. Hier gibt es einige Informationen darüber.

Wenn das Passthru-Prädikat wahr ist, gibt der Join die Zeile zurück.... Wenn das Passthru-Prädikat falsch ist, wird der Join normal fortgesetzt