Appel, Sascha wrote:

> Hi.
> 
> We are using SapDB version 7.3 Build 18 on a Windows NT 
> machine with 512MB
> of RAM and a Raid5 HD-Subsystem. The database instance is set 
> up as OLTP.
> Besides some other problems we are facing massive performance 
> issues using
> stored procedures.(Called by PHP using ODBC)  The database 
> itself is quite
> small (a backup takes about 40 Meg) but as soon as we execute 
> the below
> dbproc, our CPU usage raises to 100% while executing the 
> procedure. Even
> worse, the execution takes about 2-3 minutes to complete. Due 
> to the high
> system usage, the database server is unusable during this timeperiod.
> Now the questions are:
> - Is there any "easy to see" big error in the dbproc we 
> haven't found yet ?
> - In theory, is the database able to perform other transactions while
> executing a stored procedure ?
> - Is there any kernel parameter that could affect the speed ?
> 
> Thanks in advance,
> Sascha
> 
> --------------------SNIP--------------------
> CREATE DBPROC "I_CREATE_PROFILES" (IN OBJID INTEGER, IN UID 
> INTEGER, IN
> ID_FS_DIRECTORY INTEGER, IN ID_QUARKDOC INTEGER, IN ID_THEME 
> INTEGER, IN EDU
> INTEGER ) AS
> VAR
> ID_METAVARIABLE INTEGER;
> ID_INST_METAVARIABLE INTEGER;
> ID_DIALOGPAGE INTEGER;
> ID_NEWVARIABLE INTEGER;
> ID_NEWINSTANCE INTEGER;
> CNT INTEGER;
> STRING CHAR(200);
> ADDSTRING CHAR(200);
> NAME CHAR(64);
> 
> CREATE TABLE "TEMP"."I_CREATE_PROFILES" (
> "RESULT" INTEGER
> );
> 
> SELECT COUNT("ID") FROM "RUHRGAS"."USEROBJECTS" WHERE "ID" = :OBJID;
> FETCH INTO :CNT;
> 
> IF CNT = 0 THEN BEGIN
> 
>     INSERT INTO "RUHRGAS"."USEROBJECTS"
>     ("ID", "UID", "ID_EDU", "ID_FS_DIRECTORY", "C_DATE", 
> "C_TIME", "M_DATE",
> "M_TIME", "RELEASED",         "ID_LAST_ORDER" )
>     VALUES (:OBJID, :UID, :EDU, :ID_FS_DIRECTORY, DATE, TIME, 
> DATE, TIME,
> TRUE, 0);
> END
> ELSE BEGIN
>     UPDATE "RUHRGAS"."USEROBJECTS"
>     ( "UID", "ID_EDU", "ID_FS_DIRECTORY", "RELEASED", 
> "ID_LAST_ORDER" )
>     VALUES ( :UID, :EDU, :ID_FS_DIRECTORY, FALSE, 0 )
>     KEY "ID" = :OBJID;
> END;
> 
> /* THESE ARE THE IDS OF ALL METAVARS THAT ARE AFFECTED */
> DECLARE CMETAVARIABLES CURSOR FOR
> SELECT DISTINCT "DIALOG_META"."ID_METAVARIABLE",
> "DIALOG_META"."ID_DIALOGPAGE", "METAVARIABLES"."NAME" FROM
> "RUHRGAS"."DIALOG_META", "RUHRGAS"."METAVARIABLES"
> WHERE "DIALOG_META"."ID_DIALOGPAGE" IN
> (SELECT "ID" FROM "RUHRGAS"."DIALOGPAGE" WHERE "ID_THEME" = :ID_THEME)
> AND "DIALOG_META"."ID_METAVARIABLE" IS NOT NULL
> AND "METAVARIABLES"."NAME" LIKE '%profil%'
> AND "METAVARIABLES"."ID" = "DIALOG_META"."ID_METAVARIABLE";
> 
> FETCH CMETAVARIABLES INTO :ID_METAVARIABLE, :ID_DIALOGPAGE, :NAME;
> 
> WHILE ($RC = 0) DO BEGIN
>     SELECT COUNT ("INST_METAVARIABLES"."ID") INTO :CNT FROM
> "RUHRGAS"."INST_METAVARIABLES",     "RUHRGAS"."INSTANCES"
>     WHERE "INST_METAVARIABLES"."ID_ORIG" = :ID_METAVARIABLE
>     AND "INST_METAVARIABLES"."ID" IN
>     (SELECT "ID_INST_METAVARIABLE" FROM "RUHRGAS"."INSTANCES" 
> WHERE "OBJID"
> = :OBJID);
>     IF (CNT = 0) THEN BEGIN
>         /* GET NEXT META INST ID */
>         SELECT SEQ_INST_METAVARIABLES.NEXTVAL INTO 
> :ID_INST_METAVARIABLE
> FROM SYSDBA.DUAL;
>         INSERT INTO "RUHRGAS"."INST_METAVARIABLES" ("ID", 
> "UID", "ID_ORIG")
>         VALUES (:ID_INST_METAVARIABLE, :UID, :ID_METAVARIABLE);
> 
>         UPDATE "RUHRGAS"."INST_METAVARIABLES"
>         SET ("TOP", "LEFT", "WIDTH", "HEIGHT", "ID_ACTION_TYPE") =
>         (SELECT "TOP", "LEFT", "WIDTH", "HEIGHT", "ID_ACTION_TYPE"
>         FROM "RUHRGAS"."METAVARIABLES" WHERE "ID" = :ID_METAVARIABLE)
>         KEY "ID" = :ID_INST_METAVARIABLE;
>         /* PROFIL2 = UNTERNEHMEN, 3 = ABTEILUNG (DERZEIT 
> LEER), 4 = STRA�E +
> HAUSNUMMER, 5 = PLZ + STADT */
> SET STRING = '';
> /* GERERATE THE VARIABLE WITH THE DEFAULT */
> IF ( NAME = '_profil2_' ) THEN BEGIN
> SELECT "FIRMA" INTO :STRING FROM "RUHRGAS"."EDU" WHERE "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil3_' ) THEN BEGIN
> SELECT "ABTEILUNG" INTO :STRING FROM "RUHRGAS"."EDU" WHERE 
> "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil4_' ) THEN BEGIN
> SELECT "STRASSE" INTO :STRING FROM "RUHRGAS"."EDU" WHERE "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil5_' ) THEN BEGIN
> SELECT "CPLZ" INTO :STRING FROM "RUHRGAS"."EDU" WHERE "ID" = :EDU;
> SELECT "ORT" INTO :ADDSTRING FROM "RUHRGAS"."EDU" WHERE "ID" = :EDU;
> SET STRING = STRING & ' ' & ADDSTRING;
> END
> ELSE IF ( NAME = '_profil6_' ) THEN BEGIN
> SELECT "CPLZ" INTO :STRING FROM "RUHRGAS"."EDU" WHERE "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil7_' ) THEN BEGIN
> SELECT "ORT" INTO :STRING FROM "RUHRGAS"."EDU" WHERE "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil8_' ) THEN BEGIN
> SELECT "CPLZ" INTO :STRING FROM "RUHRGAS"."EDU" WHERE "ID" = :EDU;
> SELECT "ORT" INTO :ADDSTRING FROM "RUHRGAS"."EDU" WHERE "ID" = :EDU;
> SET STRING = STRING & ' ' & ADDSTRING;
> END
> ELSE IF ( NAME = '_profil10_' ) THEN BEGIN
> SELECT "NOMINATIV" INTO :STRING FROM "RUHRGAS"."EDU" WHERE 
> "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil11_' ) THEN BEGIN
> SELECT "GENITIV" INTO :STRING FROM "RUHRGAS"."EDU" WHERE "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil12_' ) THEN BEGIN
> SELECT "DATIV" INTO :STRING FROM "RUHRGAS"."EDU" WHERE "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil13_' ) THEN BEGIN
> SELECT "AKKUSATIV" INTO :STRING FROM "RUHRGAS"."EDU" WHERE 
> "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil14_' ) THEN BEGIN
> SELECT "ART_NOMINATIV" INTO :STRING FROM "RUHRGAS"."EDU" 
> WHERE "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil15_' ) THEN BEGIN
> SELECT "ART_GENITIV" INTO :STRING FROM "RUHRGAS"."EDU" WHERE 
> "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil16_' ) THEN BEGIN
> SELECT "ART_DATIV" INTO :STRING FROM "RUHRGAS"."EDU" WHERE 
> "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil17_' ) THEN BEGIN
> SELECT "ART_AKKUSATIV" INTO :STRING FROM "RUHRGAS"."EDU" 
> WHERE "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil18_' ) THEN BEGIN
> SELECT "POSSESIVPRONOM" INTO :STRING FROM "RUHRGAS"."EDU" 
> WHERE "ID" = :EDU;
> END
> ELSE IF ( NAME = '_profil100_' ) THEN BEGIN
> SELECT "VERB_KOOPERIEREN" INTO :STRING FROM "RUHRGAS"."EDU" 
> WHERE "ID" =
> :EDU;
> END
> ELSE IF ( NAME = '_profil101_' ) THEN BEGIN
> SELECT "VERB_UNTERSTUETZEN" INTO :STRING FROM "RUHRGAS"."EDU" 
> WHERE "ID" =
> :EDU;
> END
> ELSE IF ( NAME = '_profil102_' ) THEN BEGIN
> SELECT "VERB_PRAESENTIEREN" INTO :STRING FROM "RUHRGAS"."EDU" 
> WHERE "ID" =
> :EDU;
> END
> ELSE IF ( NAME = '_profil103_' ) THEN BEGIN
> SELECT "VERB_LADEN" INTO :STRING FROM "RUHRGAS"."EDU" WHERE 
> "ID" = :EDU;
> END;
> 
> SELECT SEQ_INST_VARIABLES.NEXTVAL INTO :ID_NEWVARIABLE FROM 
> SYSDBA.DUAL;
> 
> INSERT INTO "RUHRGAS"."INST_VARIABLES" ("ID", "UID", "CONTENT")
> VALUES (:ID_NEWVARIABLE, :UID, :STRING);
> 
> UPDATE "RUHRGAS"."INST_METAVARIABLES" ("ID_INST_VARIABLE") VALUES
> (:ID_NEWVARIABLE)
> KEY "ID" = :ID_INST_METAVARIABLE;
> 
> /* NOW GENERATE THE INSTANCE RECORD */
> SELECT SEQ_INSTANCES.NEXTVAL INTO :ID_NEWINSTANCE FROM SYSDBA.DUAL;
> 
> INSERT INTO "RUHRGAS"."INSTANCES" ("ID", "OBJID", "UID", 
> "ID_QUARKDOC",
> "ID_THEME", "ID_DIALOGPAGE", "ID_INST_METAVARIABLE")
> VALUES (:ID_NEWINSTANCE, :OBJID, :UID, :ID_QUARKDOC, :ID_THEME,
> :ID_DIALOGPAGE, :ID_INST_METAVARIABLE);
> 
> UPDATE "RUHRGAS"."INSTANCES"
> SET ("CHOOSABLE") = (SELECT "CHOOSABLE" FROM "RUHRGAS"."METAVARIABLES"
> WHERE "ID" = :ID_METAVARIABLE)
> KEY "ID" = :ID_NEWINSTANCE;
> END;
> FETCH CMETAVARIABLES INTO :ID_METAVARIABLE, :ID_DIALOGPAGE, :NAME;
> END;
> --------------------------- SNIP ---------------------------


Some comments:
- do not use UPDATE ... KEY if you want to code standard-SQL
- do not code UPDATE .. VALUES if you want to code standard-SQL
  The standard is like this: 
   UPDATE <target table> SET <set clause list> [ WHERE <search condition> ]
- you select the nextval of a sequence and then uses it twice.
  why don't you say .NEXTVAL for the first usage and .CURRVAL for the
second?
- did you check these select each by its own and have a look at the
explain-result?
  I do not know if there are indexes on some of those columns
(METAVARIABLES.ID
  or ID_THEME for example) which could improve speed.
- I do not see the need for the temp table created in the beginning.
- I do not understand, what you really want to do, therefore I cannot tell
you
  anything about a way which may be better for receiving the result you
want.
  (But, please, do not send more info to allow me to understand. I will not
have time
   for this.)

Elke
SAP Labs Berlin
_______________________________________________
sapdb.general mailing list
[EMAIL PROTECTED]
http://listserv.sap.com/mailman/listinfo/sapdb.general

Reply via email to