Re: performance tuning in large function / transaction - Mailing list pgsql-sql

From MindTerm
Subject Re: performance tuning in large function / transaction
Date
Msg-id 20011214090647.31355.qmail@web20205.mail.yahoo.com
Whole thread Raw
In response to Re: performance tuning in large function / transaction  (Stephan Szabo <sszabo@megazone23.bigpanda.com>)
Responses Re: performance tuning in large function / transaction
List pgsql-sql
Hi all,

  table :
  application : 220 rows ;
  usermenu    : 6055 rows ;

M.T.

--- Stephan Szabo <sszabo@megazone23.bigpanda.com>
wrote:
> On Fri, 14 Dec 2001, MindTerm wrote:
>
> > Hi all,
> >
> >   senario:
> >
> >   cursor 1 loop ( e.g. find student id )
> >    cursor 2 loop ( e.g. find courses of this
> student )
> >     cursor 3 loop ( e.g. update course information
> )
> >       delele course detail ...
> >       or
> >       delete course detail ... ( same primary key
> )
> >       insert course detail ... ( same primary key
> )
> >     end loop 3
> >    end loop 2
> >   end loop 1
> >
> >   It did 75 delete actions 140 update actions (
> delete
> > and insert ). The process time was about 5-6
> minutes
> > while oracle was 10 seconds to 20 seconds .
>
> Can you send the actual function and table schema
> for the associated
> tables and sizes of the tables involved (I figure
> the data itself is
> probably not available, but we may be able to see
> what's going on then)
>
>


__________________________________________________
Do You Yahoo!?
Check out Yahoo! Shopping and Yahoo! Auctions for all of
your unique holiday gifts! Buy at http://shopping.yahoo.com
or bid at http://auctions.yahoo.com-- Table: usermenu
CREATE TABLE "usermenu" (
  "um_user" numeric(11, 0) NOT NULL,
  "um_app_id" numeric(11, 0) NOT NULL,
  "um_order" varchar(50),
  "um_gif" varchar(100),
  "um_alt" varchar(50),
  "um_link" varchar(100),
  "um_level" varchar(5),
  "um_initial" varchar(1),
  "um_gallery_id" numeric(11, 0),
  "um_en_length" numeric(4, 0),
  "um_tc_length" numeric(4, 0),
  "um_sc_length" numeric(4, 0),
  "um_terminator" varchar(1),
  "um_menu" varchar(1),
  "um_en_name" varchar(1000),
  "um_tc_name" varchar(1000),
  "um_sc_name" varchar(1000),
  "um_ext" varchar(1),
  CONSTRAINT "usermenu_pkey" PRIMARY KEY ("um_user", "um_app_id"),
  CONSTRAINT "usermenu_fk1992931308295" FOREIGN KEY (um_app_id) REFERENCES "application" (app_id)
);

-- Table: application
CREATE TABLE "application" (
  "app_id" numeric(11, 0) NOT NULL,
  "app_en_name" varchar(100) NOT NULL,
  "app_tc_name" varchar(100),
  "app_sc_name" varchar(100),
  "app_menu" varchar(1),
  "app_installed" varchar(1),
  "app_order" varchar(50),
  "app_alt" varchar(50),
  "app_gif" varchar(100),
  "app_link" varchar(100),
  "app_initial" varchar(1),
  "app_gallery_id" numeric(11, 0),
  "app_terminator" varchar(1),
  "app_en_length" numeric(4, 0),
  "app_tc_length" numeric(4, 0),
  "app_sc_length" numeric(4, 0),
  "app_ext" varchar(1),
  "app_type" varchar(30),
  CONSTRAINT "application_pkey" PRIMARY KEY ("app_id")
);



BEGIN TRANSACTION;

drop function hku_usermenu( numeric, varchar, int, varchar );
CREATE FUNCTION hku_USERMENU ( numeric, varchar , int , varchar ) RETURNS varchar AS '
DECLARE
 vGroupId        ALIAS FOR $1 ;
 vUserID         ALIAS FOR $2 ;
 vGalleryId      ALIAS FOR $3 ;
 rSuccess        ALIAS FOR $4 ;
 vTmpUserID      user_group.ug_user_id%TYPE;
 vTmpGroupID     user_group.ug_id%TYPE;
 vTmpOrder       application.app_order%TYPE;
 vAclLevel       acl.acl_level%TYPE;
 vAppId          application.app_id%TYPE;
 vAppMenu        application.app_menu%TYPE;
 vAppInstalled   application.app_installed%TYPE;
 vAppTerminator  application.app_terminator%TYPE;
 vAppOrder       application.app_order%TYPE;
 vAppOrderLen    int:=0;
 vLength         int:=0;
 vOrder          application.app_order%TYPE;
 app_rec         application%ROWTYPE;
 cnt1            int:=0;
 cnt2            int:=0;
 vcnt            varchar(10):='''';
 v_str           varchar(1500):='''';
 c1              record ;
 c2              record ;
 tmptime         timestamp;
 t1              int := 0 ;
 t2              int := 0 ;
BEGIN

select timeofday() into tmptime ;
RAISE NOTICE ''[MT][START]HKU_USERMENU % % % %'', vGroupId, vUserID, vGalleryId, tmptime ;

  if vUserID = '' '' or vUserID = '''' or vUserID is null then
    vTmpGroupID := vGroupId;
  else
    vTmpGroupID := 0;
  end if;

  for c1  in
    select user_id from (
    (SELECT UG_USER_ID as user_id
     FROM   USER_GROUP
     WHERE  UG_ID          = vTmpGroupID
     and    GALLERY_ID     = vGalleryId)
    union
    (SELECT USER_ID as user_id
     FROM   HKU_USERS
     WHERE  text( USER_ID )   = vUserId
     and    GALLERY_ID     = vGalleryId)
    ) tmp
  loop
        vTmpUserID := text( c1.user_id );

        delete from usermenu where um_user = vTmpUserID ;
        for c2 in
        select ACL_APP, max(ACL_LEVEL) as acl_level, app.APP_ORDER, length(app.APP_ORDER) as app_order_length,
app.APP_MENU,app.app_installed, app.app_terminator 
        from   ACL, APPLICATION app
        where  ACL_APP            = app.APP_ID
        and    ACL_GALLERY_ID     = vGalleryId
        and    app.APP_GALLERY_ID = vGalleryId
        and    ACL_GRP in
          (select u.ug_id
           from   user_group u, user_group_master ug
           where  u.ug_user_id = vTmpUserID
           and    ug.ug_id     = u.ug_id
           and   (ug.deleted   = ''N'' or ug.deleted IS NULL )
           and    u.gallery_id = vGalleryID
           and    ug.gallery_id = vGalleryID
          )
        group by acl_app, app.app_order,app.APP_MENU, app.app_installed, app.app_terminator
        order  by app.app_order desc, ACL_LEVEL
        loop

          vAppId         := c2.ACL_APP ;
          vAclLevel      := c2.acl_level ;
          vAppOrder      := c2.APP_ORDER ;
          vAppOrderLen   := c2.app_order_length ;
          vAppMenu       := c2.APP_MENU ;
          vAppInstalled  := c2.app_installed ;
          vAppTerminator := c2.app_terminator ;

       vcnt := 0;
       vLength := vAppOrderLen;
       vTmpOrder  := vAppOrder;
       select count(*) into vcnt
       from   ACL, APPLICATION app
       where  ACL_APP            = app.app_id
       and    ACL_LEVEL          > 0
       and    APP_INSTALLED      = ''Y''
       and    ACL_GALLERY_ID     = vGalleryID
       and    app.APP_GALLERY_ID = vGalleryID
       and    substr(app.app_order,1,vAppOrderLen) = vAppOrder
       and    app.app_order      <> vAppOrder
       and    ACL_GRP in
              (select u.ug_id
               from   user_group u, user_group_master ug
               where  u.ug_user_id = vTmpUserID
               and    ug.ug_id     = u.ug_id
               and   (ug.deleted   = ''N'' or ug.deleted IS NULL)
               and    u.gallery_id = vGalleryID
               and    ug.gallery_id = vGalleryID);


       IF vAclLevel IS NULL or vAclLevel <= 0  or upper(vAppInstalled) = ''N'' THEN
         delete from usermenu where um_user = vTmpUserID and substr( um_order, 1, vAppOrderLen ) = vAppOrder;

         t1 = t1 + 1 ;

       ELSE IF vcnt > 0 or vAppTerminator = ''Y'' THEN
         for app_rec in SELECT * FROM APPLICATION WHERE app_order = vTmpOrder and  app_gallery_id = vGalleryId
         loop

           delete from usermenu where um_user = vTmpUserID and um_app_id = app_rec.app_id;
             insert into usermenu(um_user, um_app_id, um_order, um_level, um_menu, um_gallery_id,
                     um_gif, um_alt, um_link, um_terminator,
                     um_en_name, um_tc_name, um_sc_name, um_ext)
                    values (vTmpUserID, app_rec.app_id, app_rec.app_order, text( vAclLevel ) , app_rec.app_menu,
vGalleryId,
                     app_rec.app_gif, app_rec.app_alt, app_rec.app_link, app_rec.app_terminator,
                     app_rec.app_en_name, app_rec.app_tc_name, app_rec.app_sc_name, app_rec.app_ext);

/*RAISE NOTICE ''insert into usermenu(um_user, um_app_id, um_order, um_level, um_menu, um_gallery_id,
                     um_gif, um_alt, um_link, um_terminator,
                     um_en_name, um_tc_name, um_sc_name, um_ext)
                    values ( %, % , ''''%'''', % , ''''%'''', % , ''''%'''', ''''%'''' , ''''%'''', ''''%'''' ,
''''%'''',''''%'''' , ''''%'''', ''''%'''' ); ''                      
                    ,
                    vTmpUserID, app_rec.app_id, app_rec.app_order,  vAclLevel , app_rec.app_menu, vGalleryId,
                     app_rec.app_gif, app_rec.app_alt, app_rec.app_link, app_rec.app_terminator,
                     app_rec.app_en_name, app_rec.app_tc_name, app_rec.app_sc_name, app_rec.app_ext ; */

           t2 = t2 + 1 ;

           /* SELECT count(*) into rSuccess from usermenu  WHERE um_user = vTmpUserID  and   um_app_id =
app_rec.app_id;*/ 

           EXIT; /* run once (if c3%FOUND then) */

         end loop;
       END IF;
       END IF;
       vcnt := 0;
     end loop;

   end loop;

select timeofday() into tmptime ;
RAISE NOTICE ''[MT][STOP]HKU_USERMENU % % % % % %'', vGroupId, vUserID, vGalleryId, tmptime, t1, t2 ;


return ''Y'' ;

END;
' LANGUAGE 'plpgsql' ;

pgsql-sql by date:

Previous
From: Stephan Szabo
Date:
Subject: Re: performance tuning in large function / transaction
Next
From: "Mir S Islam"
Date:
Subject: cidr question