除了声明参数部分之外,我评论了我的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输入可能会增加执行时间,但没有任何反应,执行时间仍在该范围内。
答案 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_START
和PO_END
的差异超过几毫秒,我会感到惊讶。剩余的经过时间可能是由以下任何原因引起的:
客户端打开数据库连接并进行身份验证
数据库尚未激活