0

我在工作场所发现了这个 sql 文件

DECLARE

 M_DEPATURE_TIME    varchar;

BEGIN

  SELECT min(cast(to_char(i.departuredate,'DD-Mon-YYYY') as varchar) ||' '|| i.departuretime) as deptime
  INTO M_DEPATURE_TIME
  FROM myschema.flightinfosv i

  WHERE upper(i.inout) = upper(m_inout)
  AND  i.r_id= m_resconfirmid;

  RETURN M_DEPATURE_TIME;

END;

问题是为什么这个脚本将花费更多时间(超过 15 分钟)在数千条记录表中执行。表(resflightinfosv)至少包含 50,000 条记录。虽然我对“inout”和“r_id”都使用索引,并且当以 1000 个限制执行时,它会花费那个时间。我需要更改此脚本的地方在哪里?

提前致谢!

4

1 回答 1

1

您可以添加一个多列索引departuredatedeparturetime尝试这样的事情;首先提取最小日期,然后为此日期选择最小的小时。我认为以下代码不会“按原样”工作,因为我无法对其进行测试,但您明白了主要思想:)

DECLARE

 M_DEPATURE_DATE    date,
 M_DEPATURE_TIME    varchar;

BEGIN

  SELECT min(i.departuredate) as depdate
  INTO M_DEPATURE_DATE
  FROM myschema.flightinfosv i
  WHERE upper(i.inout) = upper(m_inout)
  AND  i.r_id= m_resconfirmid;

  SELECT to_char(i.departuredate,'DD-Mon-YYYY') ||' '|| min(i.departuretime) as deptime
  INTO M_DEPATURE_TIME
  FROM myschema.flightinfosv i

  WHERE upper(i.inout) = upper(m_inout)
  AND  i.r_id= m_resconfirmid
  AND  i.departuredate = M_DEPATURE_DATE

  RETURN M_DEPATURE_TIME;

END;
于 2013-09-04T16:59:45.783 回答