Ошибка подстроки Sybase 15 в операторе case при обновлении - PullRequest
0 голосов
/ 21 октября 2010

Работа на Adaptive Server Enterprise / 15.0.3 / EBF 17157 ESD # 3 / P / x86_64 / Корпоративный 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

1 Ответ

1 голос
/ 23 октября 2010

Да.

Похоже, что вы неправильно понимаете природу и то, что требуется для оптимизации запроса. Видимо, вы думаете, что есть какой-то «путь к коду», который должен выполняться иногда, а не другие. Невозможно исключить «1003 * кодированный» «путь кода» из взгляда оптимизатора. Хотя он оптимизирует запросы, с точки зрения обработки SQL, это всего лишь компилятор, а не оптимизатор.

Когда запрос оптимизирован, определяется весь путь запроса (за исключением того факта, что многие возможности оцениваются до выбора), оценивается, проверяется и компилируется. Дело не имеет значения. Чтобы ЛЮБОЙ подзапрос выполнялся, этот подзапрос должен быть оценен и скомпилирован. Тот факт, что ваш конкретный подзапрос никогда не будет выполнен, не имеет отношения к коду.

По многим причинам рекомендуется размещать код, который никогда не будет выполняться, вне программы. Будет ли выполняться ветвь в дереве запросов, определяется во время выполнения. Люди могут видеть, что он никогда не будет активирован, но оптимизатор еще не имеет такого уровня ИИ (это будет великий день, когда оптимизатор может исключить такой код).

...