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_START
和 PO_END
相差超过几毫秒,我会感到惊讶。剩余的运行时间可能是由以下任何原因造成的:
客户端打开数据库连接并进行身份验证
数据库尚未激活
除了声明参数部分,我对我的 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_START
和 PO_END
相差超过几毫秒,我会感到惊讶。剩余的运行时间可能是由以下任何原因造成的:
客户端打开数据库连接并进行身份验证
数据库尚未激活