在Adaptive Server Enterprise / 15.0.3 / EBF上运行17157 ESD#3 / P / x86_64 / Enterprise Linux / ase1503 / 2726/64位/ FBO /
以下代码永远不应该进入子字符串大小写,但是我遇到了Sybase Error 536。
这是一种优化形式,它评估所有路径,而不管实际值是什么?
我们可以解决这个问题但想知道原因吗?
declare @test float
declare @test1 char(10)
create table #TestTable
(
Dno int,
Code varchar(10)
)
Insert into #TestTable values (1,'code')
set @test1 = 'ddd'
print 'test'
select @test = case
when (1=1) then 2
when (1=0) then (select Dno FROM #TestTable WHERE Code = substring('abc',1,charindex(@test1,'a')-1) AND Dno = 1)
else 10
end
select @test
drop table #TestTable
答案 0 :(得分:1)
是
您可能误解了优化查询的性质和要求。显然你认为有时候应该执行一些“代码路径”,而不是其他代码路径。无法从优化器的注视中排除编码的“代码路径”。虽然它优化了查询,但在处理SQL方面,它只是一个编译器,而不是一个优化器。
当优化查询时,确定整个查询路径(在选择一个之前预留许多可能性的事实),评估,检查和编译。 CASE无关紧要。为了运行任何子查询,必须对子查询进行求值和编译。您的特定子查询永远不会执行的事实与代码无关。
出于多种原因,在程序之外放置永远不会执行的代码是个好主意。查询树中的分支是否将被执行,是在运行时的确定。人类可以看到它永远不会被激活,但优化者还没有那个级别的AI(当优化者可以排除这样的代码时,这将是一个盛大的日子。)