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')。

现在,我可以手动将其重写为

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

区别在于性能。第一个例子我在 90 秒内得到回报,第二个例子我在 10 秒内得到它。为什么?。

我如何改进第一个语句/重写它?

4

2 回答 2

0
FROM
(
  SELECT CAL_DATE,BUS_DAY
  FROM risk_mart.vw_calendar_t5
  WHERE type = 'RPC'
  AND BUS_DAY BETWEEN 0 AND 1
) CAL --inner view
 WHERE t.cal_date         = cal.cal_date --join of table t and CAL

现在,这是您的第一个查询。在此您首先将记录检索到内部视图 CAL 中,这需要一些时间。然后您加入t.cal_date = cal.cal_date将再次需要一些时间(总计 90 秒)。

现在,这是第二个查询。

FROM T
WHERE t.cal_date      IN ('22-OCT-12','19-OCT-12');

在这种情况下,您使用内部视图,因此您以某种方式设法dates直接获取并在您的 where 条件(硬编码)中使用它。这是您减少了内部视图(CAL)的处理时间和加入带有表 t 的 CAL 表。

于 2012-10-23T16:06:06.183 回答
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 中,一个带有连接的查询,在第一步中评估这些。组合连接以确定要检索哪些行,其中 ON 子句条件是决定从每个表中连接哪些行的标准。FROM 子句的结果是中间结果。您可以将其视为一个临时表,由满足所有连接条件的组合行组成。

这就是案例 1 比案例 2 花费更长的时间的原因。

于 2012-10-23T16:48:02.160 回答