Informix-performance计时器始终为零

时间:2018-03-15 17:36:42

标签: informix

我正在尝试在某些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;

2 个答案:

答案 0 :(得分:2)

根据文档(Informix 12.10),这是预期的行为:

  

SQL不是一种过程语言,并且CURRENT可能不会以其在语句中的位置的词汇顺序执行。你不应该使用   CURRENT标记开头,结尾,也不是特定点   执行SQL语句。

     

如果您在一个中多次使用CURRENT运算符   声明,每个实例可能返回相同的值   当前。您不能依赖CURRENT来返回每个不同的值   它执行的时间。

     

返回值基于系统时钟,并且在固定时是固定的   指定CURRENT的SQL语句开始执行。例如,   从SPL函数内部调用CURRENT即EXECUTE   FUNCTION(或EXECUTE PROCEDURE)语句调用返回值   SPL功能启动时的系统时钟。

CURRENT Operator

如果可以使用第二个进程进行时间保持算术并忽略开销,那么可能的解决方案可能是这样的:

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也会在整个执行过程中报告相同。

我知道没有一个简单的解决方法。