0

こんにちは、非常に遅い SQL があります。

select case when (value=1) 
then (select <Some Math Logic> from table where table.id=table_2.id) 
else 'false' end 
from table_2 where <where clause>

私が知りたいのは、case句がどのように機能するかです..??

その部分select <Some Math Logic> from tableは巨大なテーブルセットに取り組んでいます。

Java では、if ステートメントでそれが見られます。

if(condition_1==true) 
{return output;} 
else 
{return false;}

ifステートメントがfalseの場合、その中の部分は処理されません。知りたいのは、Oracle SQLでも同じかどうかです。

次のロジックで動作しますか..??

  • ケースの状態を確認する
  • true の場合、出力内で処理する
  • そうでなければ他の出力を処理します。

または、以下のロジックが必要ですか:

  • すべてのサブクエリを前処理する
  • ケースの状態を確認する
  • true の場合、出力内に表示
  • そうでなければ他の出力を表示します。

助けてください

編集:上記のクエリを調整したくない人...これは単なるダミーです。

私が知る必要があるのは、case 句が段階的にどのように機能するかです。

誰かがそれについて何らかの意見を持っている場合は共有してください

4

3 に答える 3

2

これで問題は解決しますか?

SELECT
   COALESCE(<Some Math Logic>, 'false')
FROM table_2 T2
    LEFT JOIN table T
        ON T.Id = T2.Id
           and T2.value = 1
WHERE <where clause>
于 2013-03-13T12:21:18.997 に答える
0

良い質問。確実に知るには、実行計画を確認する必要があります。データベースエンジンは、要求した結果が得られる限り、適切と思われるアルゴリズムを自由に使用できます。

値=1を見越して結果を取得するために外部結合tableすることもできます。または、select fromテーブルを実行し、メインクエリの実行時にスキャンできる一時テーブルに結果を格納することもできます。

ただし、ほとんどの場合、値= 1のすべての行に対してサブクエリを実行しています。計画を確認しないと、わかりにくいです。

の詳細にも依存します。骨材を取っていますか?その場合、真の結合は不可能であり、すべての行の回答を再計算する必要があります。テーブルの行の値を直接調べている場合は、それを最適化できる可能性があります。

caseステートメントを削除すると、クエリ全体のパフォーマンスが大幅に向上しますか?正しいサブクエリを分析していることを確認したい。

于 2013-03-13T12:21:44.220 に答える