执行庞大的表时的sql性能

时间:2013-09-04 16:15:58

标签: sql performance postgresql

我在我的工作场所找到了这个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限制时,将花费那段时间。我需要更改此脚本的地方?

提前致谢!

1 个答案:

答案 0 :(得分: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;