0

私は次の選択ステートメントを持っています:

(
  SELECT CAL_DATE,BUS_DAY
  FROM risk_mart.vw_calendar_t5
  WHERE type = 'RPC'
  AND BUS_DAY BETWEEN 0 AND 1
) CAL
 WHERE t.cal_date         = cal.cal_date

すべての日付を選択し、それらをbetween0 と 1 でフィルタリングします (「22-OCT-12」、「19-OCT-12」などの 2 つの日付のみを表示します)。

今、私はそれを手動で次のように書き直すことができます

WHERE t.cal_date in ('22-OCT-12','19-OCT-12')

違いはパフォーマンスです。最初の例では 90 秒以内に返され、2 番目の例では 10 秒以内に返されます。どうして?。

最初のステートメントを改善/書き直すにはどうすればよいですか?

4

2 に答える 2

0

このようにコードを書き直してみましょう。

    Case 1:
    from
        Cal
    Inner join 
    t on cal.cal_date = t.cal.date

    case 2:
      from t
      where t.cal_date in (....)

Selectステートメントの最初のステップは常に「FROM」句です。ケース2の場合、最初のステップは常にFROM句です。あなたの場合、テーブルが1つしかないため、これは非常に簡単です。複雑な結合について心配する必要はありません。

ケース1、結合を使用したクエリの場合、これらはこの最初のステップで評価されます。結合は、取得する行を決定するためにアセンブルされます。ON句の条件は、各テーブルから結合する行を決定するための基準です。FROM句の結果は中間結果です。これは、すべての結合条件を満たす結合された行で構成される一時テーブルと考えることができます。

そのため、ケース1はケース2よりも時間がかかります。

于 2012-10-23T16:48:02.160 に答える