了解Firebird监控表中的MON $ STAT_ID

时间:2014-08-09 20:01:19

标签: firebird firebird2.1

我几周后发布了询问firebird DB以及如何监控它的信息。从那以后,我想出了一个漂亮的脚本来监控所有的页面读/写/提取/标记。我监控的其中一个列是MON$STAT_IDMON$STAT_GROUP字段。这为我打印了一个很好的数字;但是,我没有办法关联和理解究竟是什么。我认为打印MON$STAT_GROUP会有所帮助,但它还没有以任何方式帮助我......

我还查看了RDB$命令,但发现了非常有限的文档,看看它们是否可以帮助我监控我的数据库。

所以我决定来这里,首先询问我是否正在监视我的数据库,以便其他人可以从页面读取/写入/提取/标记中查看数据,并对数据库是否正在执行进行智能决策正如所料。

其次,将RDB$命令添加到我的脚本中会添加任何内容到我将为数据库人员提供的数据值吗?

最后,也许最重要的是,是否有将MON$STAT_ID字段与数据库中的实际表相关联,以了解何时发生的事情不应该是什么?我目前正在每分钟监视数据库,这可能是频繁的,但我得到有效的数据。现在唯一的问题是如何解释这些数据。有人可以给我一些关于他们过去使用/曾经使用过的方法的建议吗?

(注意:运行firebird 2.1)

2 个答案:

答案 0 :(得分:6)

MON$STAT_ID中的MON$IO_STATS列(以及MON$RECORD_STATSMON$MEMORY_USAGE)是监控表中记录的主键。几乎所有其他监控表都包含MON$STAT_ID来指向这些统计信息:MON$ATTACHMENTSMON$CALL_STACKMON$DATABASEMON$STATEMENTSMON$TRANSACTIONS

换句话说:统计数据适用于数据库,附件,事务,语句或调用级别(PSQL执行)。统计信息表包含一个名为MON$STAT_GROUP的列,用于识别这些类型。 MON$STAT_GROUP中描述了RDB$TYPES的值:

  • 0:DATABASE
  • 1:ATTACHMENT
  • 2:TRANSACTION
  • 3:STATEMENT
  • 4:CALL

通常,级别0的统计信息包含级别1的所有级别,级别1包含该级别的所有级别2,级别2包含该级别的所有级别3,级别3包含该级别的所有级别4。

由于可能存在与较低级别无关的处理数据,或者特定附件,事务或语句句柄已被删除,较低级别的数字不一定会聚合到较高级别的整数。

无法将统计信息与特定表关联起来(因为此信息与表无关,但是 - 简化 - 执行可能涵盖多个表的语句)。

正如我也评论过,我不确定你对“RDB$命令”的意思。但我假设你在谈论RDB$GET_CONTEXT()RDB$SET_CONTEXT()。您可以使用RDB$GET_CONTEXT()获取当前连接(SESSION_ID)和事务ID(TRANSACTION_ID)。这些值可用于监视表中的MON$ATTACHMENT_IDMON$TRANSACTION_ID。我不认为SYSTEM命名空间中的其他变量很有趣,而USER_SESSIONUSER_TRANSACTION中的变量都是用户定义的(最初这些命名空间是空的)。

在语句中使用CURRENT_CONNECTIONCURRENT_TRANSACTION上下文变量要容易得多。如Firebird安装中的doc\README.monitoring_tables.txt中所述:

  

系统变量CURRENT_CONNECTION和CURRENT_TRANSACTION可用于分别选择有关当前(用于调用者)连接和事务的数据。这些变量对应于相应监视表的ID列。

注意:我的回答是基于Firebird 2.5。

答案 1 :(得分:0)

要按特定表格显示统计信息,我使用此SQL(FB 3)

@Override
public void onResume() {
    super.onResume();

    if (getActivity() != null)
        FirebaseAnalytics.getInstance(getActivity()).setCurrentScreen(getActivity(), "Notifications", getActivity().getClass().getSimpleName());
}