SP执行时间

SP execution time

除了声明参数部分,我对我的 SP 的所有内容都进行了评论。 SP Body 如下所示,注意 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 来说已经很多了。这里有什么问题?这个时间是否也包含get connection时间?如果是,如何在不获取连接时间的情况下查看SP执行时间?

请注意,我尝试从输入参数中删除 PI_XML,因为我认为 XML 输入可能会增加执行时间,但什么也没发生,执行时间仍在该范围内。

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

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 相差超过几毫秒,我会感到惊讶。剩余的运行时间可能是由以下任何原因造成的:

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

  • 数据库尚未激活