SP执行时间

时间:2015-01-18 06:26:57

标签: stored-procedures db2 execution-time

除了声明参数部分之外,我评论了我的SP的所有主体。 SP Body就像下面这样,注意身体的所有其他部分都有注释。

OUT PO_ERROR            INTEGER,
IN  PI_CURRENT_DATE     INTEGER,
IN  PI_USER_ID          DECIMAL(15),
IN  PI_BID              DECIMAL(15),
IN  PI_AID              DECIMAL(15),
IN  PI_UUID             VARCHAR(36),
IN  PI_XML              XML,
OUT PO_VERSION          INTEGER,
OUT PO_ERROR_MSG        INTEGER,
OUT PO_BID              DECIMAL(15),                               
OUT PO_STEP             INTEGER

SPECIFIC ESPNAME1
RESULT SETS 1
MODIFIES SQL DATA
NOT DETERMINISTIC
NULL CALL
LANGUAGE SQL
BODY: BEGIN

      DECLARE L_SQLCODE         INT         DEFAULT 0;
      DECLARE SQLCODE           INTEGER     DEFAULT 0;

      DECLARE L_AID             INTEGER     DEFAULT 0;
      DECLARE L_BNO             INTEGER     DEFAULT 0;
      DECLARE L_BID             INTEGER     DEFAULT 0;

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION 
SET L_SQLCODE = SQLCODE;

DECLARE CONTINUE HANDLER FOR NOT FOUND  
SET L_SQLCODE = SQLCODE;

SET PO_ERROR = 0; 
SET PO_STEP = 0;
SET PO_ERROR_MSG = 0;
COMMIT;                                        

END BODY 

问题:我使用指定的输入参数运行SP,每次SP的执行时间在140ms到180ms的范围内。我认为这个执行时间对于没有身体的SP来说很重要。这有什么不对?这次包含连接时间吗?如果是,如何在没有连接时间的情况下检查SP执行时间?

请注意,我尝试从输入参数中删除PI_XML,因为我认为XML输入可能会增加执行时间,但没有任何反应,执行时间仍在该范围内。

1 个答案:

答案 0 :(得分:1)

如果捕获过程本身内部的开始和结束时间,则仅测量存储过程部件的经过时间要容易得多。实现此目的的一种方法是临时向其添加几个输出参数,如下所示:

CREATE PROCEDURE ...
OUT PO_START TIMESTAMP,
OUT PO_END TIMESTAMP )
...
BODY:BEGIN
SET PO_START = CURRENT TIMESTAMP;
... -- Rest of the procedure
SET PO_END = CURRENT TIMESTAMP;
END BODY

在一个无用的程序中,例如你正在测试的程序,如果PO_STARTPO_END的差异超过几毫秒,我会感到惊讶。剩余的经过时间可能是由以下任何原因引起的:

  • 客户端打开数据库连接并进行身份验证

  • 数据库尚未激活