Няма гаранция за това поведение.
Пример за оценка на късо съединение не случва с expr1 AND expr2
е
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)
е false
(което означава And
-ed изразът трябва да бъде False
), но резултатите от IO показват, че второто условие все още е оценено.
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 може направи това все пак. Виждам това в моя тест
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'
Резултатът е
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
никога не е бил достъпен.
Това се осъществява чрез преминаване през предикатно условие в плана за изпълнение. Тук има информация за тях.
Ако предикатът passthru се оценява на true, присъединяването връща реда.... Ако предикатът passthru се оценява на false, присъединяването продължава нормално