2

几周前我发布了关于 firebird DB 以及如何监控它的信息。从那时起,我想出了一个漂亮的脚本来监控所有页面的读取/写入/获取/标记。我正在监视的列之一是MON$STAT_IDMON$STAT_GROUP字段。这对我来说是一个不错的数字;但是,我无法关联和理解它到底是什么。我认为打印出来MON$STAT_GROUP会有所帮助,但它还没有以任何方式帮助我......

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

所以我决定来这里,首先询问我是否以其他人可以查看页面读取/写入/获取/标记的数据的方式监控我的数据库,并就数据库是否按预期执行做出明智的决定。

其次,RDB$向我的脚本添加命令是否会增加我将提供给数据库人员的数据的价值?

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

(注意:运行 firebird 2.1)

4

2 回答 2

6

(and and ) 中的列MON$STAT_ID是监控表中记录的主键。几乎所有其他监控表都包含一个指向这些统计信息:、、、、。MON$IO_STATSMON$RECORD_STATSMON$MEMORY_USAGEMON$STAT_IDMON$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()and RDB$SET_CONTEXT()。您可以使用RDB$GET_CONTEXT()获取当前连接 ( SESSION_ID) 和事务 id ( TRANSACTION_ID)。这些值值可用于监控表MON$ATTACHMENT_IDMON$TRANSACTION_ID在监控表中。我不认为SYSTEM命名空间中的其他变量很有趣,并且这些USER_SESSION变量USER_TRANSACTION都是用户定义的(最初这些命名空间是空的)。

在语句中使用CURRENT_CONNECTION和上下文变量要容易得多。CURRENT_TRANSACTIONdoc\README.monitoring_tables.txtFirebird 安装中所述:

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

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

于 2014-08-10T08:13:03.910 回答
0

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

select t.mon$table_name,trim(
case when r.mon$record_seq_reads>0 then 'Non index Reads: '||r.mon$record_seq_reads else '' end||
case when r.mon$record_idx_reads>0 then ' Index Reads: '||r.mon$record_idx_reads else '' end||
case when r.mon$record_inserts>0 then ' Inserts: '||r.mon$record_inserts else '' end||
case when r.mon$record_updates>0 then ' Updates: '||r.mon$record_updates else '' end||
case when r.mon$record_deletes>0 then ' Deletes: '||r.mon$record_deletes else '' end)
from MON$TABLE_STATS t
join mon$record_stats r on r.mon$stat_id=t.mon$record_stat_id
where t.mon$table_name not starting 'RDB$' and r.mon$stat_group=2
order by 1
于 2018-12-07T05:53:10.483 回答