0

Adaptive Server Enterprise / 15.0.3 / EBF 17157 ESD#3 / P / x86_64 / Enterprise Linux / ase1503/2726/64ビット/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 に答える