pl / sql和msql连接,性能降低

时间:2017-03-21 11:23:25

标签: sql oracle performance inner-join

我正在尝试制作反向日历。也就是说,当提供正常日期时,它可以区分日期与月末的日期。

t_calendar只是我使用的临时日历,它有日期,但我想更新它并将inverse_day和inverse_week_of_month列设置为反向日期。

我在MSQL上成功完成了以下操作:

   UPDATE @t_calendar
   SET inverse_day = b.max_day_of_month - a.day + 1,
       inverse_week_of_month = ( b.max_day_of_month - a.day ) / 7  + 1
   FROM @t_calendar a
   INNER JOIN ( SELECT year, month, MAX( day ) max_day_of_month FROM @t_calendar GROUP BY year, month ) b  ON b.year = a.year AND b.month = a.month;

我在pl / sql中做了类似的工作:

    UPDATE t_calendar a 
   SET inverse_day = customDate1.max_day - a.day + 1,
   inverse_week_of_month = TRUNC(( customDate1.max_day - a.day ) / 7)  + 1
   WHERE customDate1.year = a.year AND customDate1.month = a.month;

但它非常慢,即如果MSQL需要2秒,pl / sql将需要几分钟。所以这不是我认为的好解决方案。我尝试复制pl / sql上的MSQL代码,由于我的单元测试失败,它似乎与以前的工作方式不同:

   UPDATE t_calendar
   SET (inverse_day, inverse_week_of_month) = (
        SELECT b.max_day_of_month - a.day + 1, TRUNC(( b.max_day_of_month - a.day ) / 7)  + 1
   FROM t_calendar a
   inner JOIN ( SELECT  year, month, MAX( day ) max_day_of_month FROM t_calendar GROUP BY year, month ) b  
   ON  b.year = a.year AND b.month = a.month
   where rownum <= 1); 

我可以用什么方法在pl / sql中对此进行优化,因为我对它很新,或者使连接按预期工作。

1 个答案:

答案 0 :(得分:2)

我认为你的第二个和第三个片段与第一个片段没有相同的逻辑。相当于Oracle SQL中的第一个片段(不是PL / SQL,这是Oracle的程序语言)将是:

UPDATE t_calendar a
SET (inverse_day, inverse_week_of_month) = 
(  SELECT max(b.day) - a.day + 1, TRUNC(( max(b.day) - a.day ) / 7)  + 1
   FROM   t_calendar b
   WHERE  b.year = a.year
   AND    b.month = a.month
 ) u

像这样的t_calendar的索引也可能会有所帮助:

CREATE INDEX ON t_calendar ( year, month, day desc )

抱歉,我不在Oracle数据库前面检查语法错误等。