Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Условно ли е MS-SQL И/ИЛИ (извършване на оценка на късо съединение)?

Няма гаранция за това поведение.

Пример за оценка на късо съединение не случва с 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, присъединяването продължава нормално



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Проактивни проверки на състоянието на SQL Server, част 4:ERRORLOG

  2. 3 начина да получите първия ден от месеца в SQL Server

  3. Отстраняване на неизправности при предоставяне на променлива памет в SQL Server

  4. В SQL Server, как мога да намеря навсякъде, където има препратка към колона?

  5. SQL Server Database Change Listener C#