我正在尝试在某些Informix sprocs中设置一个性能计时器,以查看插件的使用时间。我想我很接近,但是我已经全部归零了。我也在真正的sprocs中使用下面的代码,它包含真正的insert语句(即,不仅仅是sleep语句)。它仍然返回全零。我想,它至少应该是几毫秒。什么事情都跳出来我说错了?
编辑:我也尝试使用sysdate
代替current
,但仍然全部为零。
C#中的返回值:0.00000
测试sproc:
CREATE PROCEDURE JayTest() returning char(10);
define start datetime second to fraction(5);
define end datetime second to fraction(5);
let start = current;
system "sleep 1"; -- stuff happens here that I want to time
let end = current;
return ((end - start)::interval second to fraction(5))::char(10);
END PROCEDURE;
答案 0 :(得分:2)
根据文档(Informix 12.10),这是预期的行为:
SQL不是一种过程语言,并且CURRENT可能不会以其在语句中的位置的词汇顺序执行。你不应该使用 CURRENT标记开头,结尾,也不是特定点 执行SQL语句。
如果您在一个中多次使用CURRENT运算符 声明,每个实例可能返回相同的值 当前。您不能依赖CURRENT来返回每个不同的值 它执行的时间。
返回值基于系统时钟,并且在固定时是固定的 指定CURRENT的SQL语句开始执行。例如, 从SPL函数内部调用CURRENT即EXECUTE FUNCTION(或EXECUTE PROCEDURE)语句调用返回值 SPL功能启动时的系统时钟。
如果可以使用第二个进程进行时间保持算术并忽略开销,那么可能的解决方案可能是这样的:
SELECT SYSDATE AS start FROM systables WHERE tabid = 1;
PROCEDURE JayTest();
SELECT SYSDATE AS end FROM systables WHERE tabid = 1;
还可以使用sh_curtime
数据库中的表sysshmvals
中的列sysmaster
,如
How to obtain the actual date and time in a stored procedure
该列包含实际的系统时间,但它只有一个精度到第二个,如果我们想要间隔达到几分之一秒,那么就没用了。
答案 1 :(得分:1)
这是正常的。时间在存储过程的持续时间内被冻结 - 即使您在过程中间运行SYSTEM('sleep 100');
,CURRENT也会在整个执行过程中报告相同。
我知道没有一个简单的解决方法。