0

在 Adaptive Server Enterprise/15.0.3/EBF 17157 ESD#3/P/x86_64/Enterprise Linux/ase1503/2726/64-bit/FBO/ 上运行

下面的代码不应该输入子字符串大小写,但是我看到了 Sybase 错误 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
4

1 回答 1

1

是的。

您似乎误解了优化查询的性质和要求。显然,您认为有时应该执行一些“代码路径”,而不是其他的。从优化器的视线中排除编码的“代码路径”是不可能的。虽然它优化了查询,但在处理 SQL 方面,它只是一个编译器,而不是一个优化器。

优化查询时,会确定整个查询路径(撇开在选择一个之前评估许多可能性这一事实不谈)、评估、检查和编译。CASE 无关紧要。为了让任何子查询运行,必须评估和编译该子查询。您的特定子查询永远不会执行的事实与代码无关。

由于许多原因,将永远不会执行的代码放在程序之外是一个好主意。查询树中的分支是否会被执行,是在运行时决定的。人类可以看到它永远不会被激活,但是优化器还没有那个级别的 AI(优化器可以排除此类代码将是一个盛大的日子)。

于 2010-10-23T04:40:15.800 回答