PostgreSQL问题

时间:2013-10-15 18:02:52

标签: postgresql

我正在PostgreSQL中编写一个函数,并想知道我是否可以执行以下操作:

  1. 我在每个if循环中都有一个insert语句。我可以为formatdate1和formatdate2传递这样的值吗?

  2. 我也在更新表格。我们是怎么做的PostgreSQL?

    CREATE OR REPLACE FUNCTION Check returns void AS $$
    
    DECLARE
    startDate=date;
    formateDate1=date; formatdate2=date;newDate=date;
    
    BEGIN
    startDate:= SELECT to_date(lastdate::date, 'MM-DD-YYYY') FROM setup;
    for i in 1..3 LOOP
    IF i = 1 THEN
    formateDate1 := select (startDate - INTERVAL '11 months');
    formatdate2:= to_date(formatdate2::date,'YYYYMM');
    
    insert into warehouse.memcnts1 (select distinct source,
    formatdate2 
    as yearmo, to_date(formateDate1, 'MM-DD-YYYY') 
     where effdt <= formateDate1 and enddt >= formateDate1);
    
    
    ELSIF i = 2 THEN  -- this is todays date
    --insert query here     
    insert into warehouse.memcnts1 (select distinct source,formatdate2 as yearmo, to_date(formateDate1, 'MM-DD-YYYY') where effdt <= formateDate1
    
    and enddt >= formateDate1);
    
       ELSIF i = 3 THEN
    
       formateDate1 := select (startDate + INTERVAL '1 months');
        newDate=formateDate1;
    
    
    
        update dwset SET lastdate := newDate; -- wonder if this is right?
    
        formatdate2:=startDate;
       END IF;
    
       END LOOP;
    
         END
    $$ language 'plpgsql';
    

1 个答案:

答案 0 :(得分:0)

通常,如果循环变得足够大,任何类型的insert,insert,update循环都会遇到问题。我假设你想做一些像

这样的事情
 FOR 1 .. n
 LOOP
      INSERT INTO foo VALUES (...);
      INSERT INTO foo VALUES (...);
      UPDATE BAR set ....;
  END LOOP;

我做出了这个假设,因为没有理由做一个循环,然后为每个循环运行不同的逻辑。

上面的问题是,当n变大(比方说,超过一百左右)时,您可能会开始遇到缓存管理问题,这些问题可能会突然开始导致大量随机磁盘I / O活动长查询。没有什么比想知道为什么给定的函数调用在100ms的循环中运行50次迭代,但在1800000 ms内运行1000次迭代的循环。 (去过那里,完成了)。

通常,您希望尝试运行逻辑避免循环,而是执行set操作。

我希望这会有所帮助。很难看出你在问什么。