SQL Server性能提示

fra*_*sco 3 sql t-sql sql-server performance sql-server-2005

可能重复:
SQL WHERE子句是否已短路评估?

关于此查询,我有以下问题:

select * from sometable 
where 1=1 or (select count(*) from table2 > 0)
Run Code Online (Sandbox Code Playgroud)

如果第一个条件为true(1=1),SQL Server是否仍然执行内部选择?或者在第一个条件为真时停止(如C)

Ric*_*iwi 7

当(1 = 1)为真时停止.您可以使用Ctrl-M然后按Ctrl-E轻松检查

考虑这个查询

select * from master..spt_values
where 1=1 or (select count(*) from master..sysobjects) > 0
Run Code Online (Sandbox Code Playgroud)

执行计划仅显示扫描master..spt_values并且没有活动sysobjects.

与C相反,当LEFTMOST条件为真时,它不会停止,而是查询优化器独立于所显示的顺序进行计算,这是评估的最低成本.在常数的情况下,1 vs 1胜利者是明确的.


gbn*_*gbn 5

它只是因为你在比较文字而被短路.优化器检测到这种微不足道的比较.

但是,如果您已强制参数化设置,则文字将更改为参数,SQL Server将根据一般情况进行操作,即每一方可能不同.受强制参数化的长条件列表的限制......