事务统计的sql

oceanbase的社区版本4.3.1统计某个库的某个表正在运行的事务数量的sql是什么,有兼容方式吗,不同版本都不一样

@论坛小助手

根据文档库中的信息,OceanBase 数据库提供了系统视图来查询事务相关的统计信息。以下是对您问题的详细解答:

1. 查询正在运行的事务数量

在 OceanBase 社区版 4.3.1 中,可以通过查询 GV$OB_TRANSACTION 系统视图来获取当前正在运行的事务信息。具体 SQL 示例如下:

SELECT COUNT(*) AS running_transactions_count
FROM oceanbase.GV$OB_TRANSACTION
WHERE tenant_id = <目标租户ID> AND table_id = <目标表ID>;
  • tenant_id:指定目标租户的 ID。
  • table_id:指定目标表的 ID。可以通过查询 __all_table 系统表获取表的 table_id

例如,查询某个表的 table_id

SELECT table_id FROM oceanbase.__all_table WHERE table_name = '<表名>';

2. 兼容方式

不同版本的 OceanBase 数据库可能对事务统计的视图和字段有所调整,但核心逻辑保持一致。如果需要兼容多个版本,可以尝试以下通用方法:

方法一:通过 GV$OB_SQL_AUDIT 统计

GV$OB_SQL_AUDIT 视图记录了 SQL 的执行审计信息,可以通过过滤条件统计当前正在运行的事务数量。示例如下:

SELECT COUNT(*)
FROM oceanbase.GV$OB_SQL_AUDIT
WHERE tenant_id = <目标租户ID>
  AND sql_id = <目标SQL_ID>
  AND is_running = 1;
  • is_running:标识事务是否正在运行(1 表示正在运行)。

方法二:通过 GV$OB_TRANSACTION 统计

如果目标版本支持 GV$OB_TRANSACTION 视图,则可以直接使用该视图进行统计。这是推荐的方式,因为它是专门为事务统计设计的。

3. 注意事项

  • 租户隔离:确保查询时指定正确的 tenant_id,以避免跨租户数据干扰。
  • 表 ID 获取:如果不确定目标表的 table_id,可以通过查询 __all_table 系统表获取。
  • 版本差异:不同版本的 OceanBase 数据库可能对视图字段有所调整,请参考对应版本的官方文档确认字段名称和含义。

4. 总结

  • 如果您的目标是统计某个库的某个表正在运行的事务数量,建议优先使用 GV$OB_TRANSACTION 视图。
  • 如果需要兼容多个版本,可以结合 GV$OB_SQL_AUDIT 和其他相关视图实现统计。

如果您需要进一步的帮助,请提供更多上下文信息,例如具体的租户 ID 或表名。

详情请参考:

  1. 并行查询的执行
  2. 实时执行计划展示
  3. 监控告警
  4. 开启事务
  5. 分析系统或某个 SQL 的执行是否出现大量不合理远程执行请求
  6. 手动收集统计信息
  7. 查询 OceanBase 集群的最后一个运维任务
  8. 查询 SQL 流量分布情况及 QPS
  9. 并发控制概述
  10. 快速参数化
2 个赞

麻烦提供一下你之前查询使用的哪些表,这边看看内部表是否可以涵盖

SELECT COUNT(*) AS active_trans_count
FROM oceanbase.GV$OB_SQL_AUDIT a
WHERE a.tenant_id = (
SELECT tenant_id
FROM oceanbase.__all_tenant
WHERE tenant_name = ‘ob_icm’ – 租户名
)
AND query_sql LIKE ‘%sys_app%’
AND state = ‘ACTIVE’;目前是使用这个,但是state字段值不对,没找到哪个值可以去判断事务正在运行

select * from oceanbase.__all_virtual_trans_stat;
select * from oceanbase.__all_virtual_trans_lock_stat;
select * from GV$OB_TRANSACTION_SCHEDULERS;

您发起事务,看下这几个表

obdiag 的一键洞察可以试试,对应的文档: https://www.oceanbase.com/docs/common-obdiag-cn-1000000002488237

对应的SQL:
https://github.com/oceanbase/obdiag/blob/master/plugins/display/tasks/observer/long_transaction.yaml

SQL 记录的是执行完的SQL,查询这个没啥意思,正在运行的事务需要查询 gV$OB_TRANSACTION_PARTICIPANTS