DBE_PERF.STATEMENT_HISTORY
获得当前节点的执行语句的信息。只可在系统库中查询到结果,用户库中无法查询,如表1所示。
| 名称 | 类型 | 描述 |
|---|---|---|
| db_name | name | 数据库名称。 |
| schema_name | name | 模式名称。 |
| origin_node | integer | 节点名称。 |
| user_name | name | 用户名。 |
| application_name | text | 用户发起的请求的应用程序名称。 |
| client_addr | text | 用户发起的请求的客户端地址。 |
| client_port | integer | 用户发起的请求的客户端端口。 |
| unique_query_id | bigint | 归一化SQL ID。 |
| debug_query_id | bigint | 唯一SQL ID。部分语句存在不唯一的情况,如Parse报文、DCL和TCL等语句的debug_query_id值为0。存储过程内的语句使用同一个ID。 |
| query | text | 归一化SQL(仅CN上有值)。 |
| start_time | timestamp with time zone | 语句启动的时间。 |
| finish_time | timestamp with time zone | 语句结束的时间。 |
| slow_sql_threshold | bigint | 语句执行时慢SQL的标准。 |
| transaction_id | bigint | 事务ID。 |
| thread_id | bigint | 执行线程ID。 |
| session_id | bigint | 用户session id。 |
| n_soft_parse | bigint | 软解析次数,n_soft_parse + n_hard_parse可能大于n_calls,因为子查询未计入n_calls。(该字段对非DML语句无意义) |
| n_hard_parse | bigint | 硬解析次数,n_soft_parse + n_hard_parse可能大于n_calls,因为子查询未计入n_calls。对复杂数据类型的解析也会额外增加解析次数,例如smalldatetime类型。(该字段对非DML语句无意义) |
| query_plan | text | 语句执行计划。 |
| n_returned_rows | bigint | SELECT返回的结果集行数。 |
| n_tuples_fetched | bigint | 随机扫描行,即回表次数。回表是指在使用索引进行查询时,如果查询的列不在索引中,数据库引擎需要通过索引中的主键或唯一标识符再次访问主表以获取所需的完整数据行的过程。 |
| n_tuples_returned | bigint | 顺序扫描行,通过顺序扫描获取的活动行数与通过索引扫描返回的索引条目数之和。 |
| n_tuples_inserted | bigint | 插入行。 |
| n_tuples_updated | bigint | 更新行。 |
| n_tuples_deleted | bigint | 删除行。 |
| n_blocks_fetched | bigint | buffer的块访问次数,表示从缓冲区和磁盘中读取block的总数。 |
| n_blocks_hit | bigint | buffer的块命中次数,表示从缓冲区中读取block的数量。 |
| db_time | bigint | 有效的DB时间花费,多线程将累加(单位:微秒)。 |
| cpu_time | bigint | CPU消耗时间(单位:微秒)。 |
| execution_time | bigint | 执行器内执行时间(单位:微秒)。 |
| parse_time | bigint | SQL解析时间(单位:微秒)。(若解析阶段出现异常,不记录parse_time) |
| plan_time | bigint | SQL生成计划时间(单位:微秒)。(若计划生成阶段出现异常,不记录plan_time) |
| rewrite_time | bigint | SQL重写时间(单位:微秒)。(若重写阶段出现异常,不记录rewrite_time) |
| pl_execution_time | bigint | plpgsql上的执行时间(单位:微秒)。 |
| pl_compilation_time | bigint | plpgsql上的编译时间(单位:微秒)。 |
| data_io_time | bigint | I/O上的时间花费(单位:微秒)。 |
| net_send_info | text | 通过物理连接发送消息的网络状态,包含时间(微秒)、调用次数、吞吐量(字节)。在分布式数据库中,CN与CN、CN与客户端以及CN与DN之间都是通过物理连接进行通信,通过该字段可以分析SQL在分布式系统下的网络开销。例如:{"time":xxx, "n_calls":xxx, "size":xxx}。 |
| net_recv_info | text | 通过物理连接接收消息的网络状态,包含时间(微秒)、调用次数、吞吐量(字节)。在分布式数据库中,CN与CN、CN与客户端以及CN与DN之间都是通过物理连接进行通信,通过该字段可以分析SQL在分布式系统下的网络开销。例如:{"time":xxx, "n_calls":xxx, "size":xxx}。 |
| net_stream_send_info | text | 通过逻辑连接发送消息的网络状态,包含时间(微秒)、调用次数、吞吐量(字节)。在分布式数据库中,不同分片的DN之间通过逻辑连接进行通信,通过该字段可以分析SQL在分布式系统下的网络开销。例如:{"time":xxx, "n_calls":xxx, "size":xxx}。 |
| net_stream_recv_info | text | 通过逻辑连接接收消息的网络状态,包含时间(微秒)、调用次数、吞吐量(字节)。在分布式数据库中,不同分片的DN之间通过逻辑连接进行通信,通过该字段可以分析SQL在分布式系统下的网络开销。例如:{"time":xxx, "n_calls":xxx, "size":xxx}。 |
| lock_count | bigint | 加锁次数。 |
| lock_time | bigint | 加锁耗时。 |
| lock_wait_count | bigint | 加锁等待次数。 |
| lock_wait_time | bigint | 加锁等待耗时。 |
| lock_max_count | bigint | 最大持锁数量。 |
| lwlock_count | bigint | 轻量级加锁次数(预留)。 |
| lwlock_wait_count | bigint | 轻量级加锁等待次数。 |
| lwlock_time | bigint | 轻量级加锁时间(预留)。 |
| lwlock_wait_time | bigint | 轻量级加锁等待耗时。 |
| details | bytea | 等待事件、语句锁事件和GSTrace函数运行时间的列表。 记录级别的值>=L0时,开始记录等待事件的列表。显示当前节点wait event的相关统计信息。内核中关键的事件信息见表2。或从视图wait_event_info中查看系统中所有的事件列表。关于每种事务锁对业务的影响程度,请参考LOCK语法小节的详细描述。通过GStrace全链路跟踪函数,GStrace字段函数名function,以树形结构表达函数父子关系;GStrace字段函数运行时间duration字段表示函数运行时间,单位为微秒。 记录级别的值是L2时,开始记录语句锁事件的列表,该列表按时间顺序记录事件,记录的锁事件数量受参数track_stmt_details_size的影响。 该字段为二进制,需要借助解析函数pg_catalog.statement_detail_decode进行读取,请参见(表22)。 事件包括:
|
| is_slow_sql | boolean | 该SQL是否为slow SQL。 |
| trace_id | text | 驱动传入的trace id,与应用的一次请求相关联。 |
| advise | text | 可能导致该SQL为slow SQL的风险信息。 说明: 如果语句通过SQLBypass方式执行(可通过explain查看计划判断,请参见enable_opfusion的参数说明),可以认为无慢SQL风险,本字段信息可能会缺失。 |
| parent_unique_sql_id | bigint | 当前语句的外层SQL的归一化SQL ID,对于存储过程内执行的语句,该值为调用存储过程语句的归一化SQL ID,存储过程外的语句该值为0。 |
| finish_status | text | 语句完成状态,默认值normal。cancelled表示被取消或被terminate。error表示除cancelled外,其他异常导致的结束。 |
| used_memory | integer | 单条语句内存使用量(单位:MB)。 |
| lock_max_local_count | bigint | 经过locallock机制持锁的最大持锁数量。 |
| lock_max_fastpath_count | bigint | 经过fastpath机制持锁的最大持锁数量。 |
| lock_max_global_count | bigint | 经过主锁表持锁的最大持锁数量。 |
| driver_start_time | timestamp with time zone | JDBC驱动开始执行的时间点。 |
| driver_wait_response | timestamp with time zone | JDBC驱动发送报文后的开始等待接收数据库返回数据的时间点。 |
| driver_finish_time | timestamp with time zone | JDBC驱动接收数据库返回数据完成的时间点。 |
| driver_info | json | JDBC驱动各报文发送和接收的时间点。 参数track_stmt_stat_level修改后,会在新建立连接的会话生效,现有会话不生效。 |
| kernel_info | json | 数据库各报文发送和接收的时间点。 |
| adaptive_join_states | text | 记录自适应连接算子最终选用的连接方式,记录格式为[plan_node_id, use_hashjoin],第一位代表对应的plan_node_id,第二位代表是否使用HashJoin,1代表是,0代表否。 |
| aplan_count | bigint | aplan执行次数。 |
| aplan_parse_time | bigint | aplan解析时间。 |
| aplan_execution_time | bigint | aplan执行时间。 |
| sql_hash | bigint | 当前SQL语句的哈希值。 |
| plan_hash | bigint | 当前SQL计划的哈希值。 |
| plan_hash_prev | bigint | 如果是Generic Plan,此值为上一次使用的计划的哈希值。 |
| relids | text | 语句中涉及表的pg_class.oid,多表按“,”隔开。 |
- 当track_stmt_stat_level中Full SQL和Slow SQL不全为OFF时,对于超过log_min_duration_statement阈值的SQL,is_slow_sql字段会记录为true,表明这是一个超过阈值的SQL,其他字段以track_stmt_stat_level中的级别为记录标准。
- 由于自适应连接不支持分布式,分布式下adaptive_join_states不生效。
- 由于查询计划管理(SQL Plan Management)不支持分布式,分布式下sql_hash、plan_hash和plan_hash_prev不生效。
- 分布式存储过程子语句锁相关指标不会向顶层语句进行汇聚。
- 当查询计划记录失败时,会在query_plan字段中提示记录失败的原因,如以下场景:
- 在LightProxy场景下语句会下推,不在CN节点上记录计划,会在DN节点上记录。提示:“The current plan is lightproxy. Please check the query_plan on the DN node.”。
- 在Stream场景下计划会下推,会在CN节点上记录计划,不会在DN节点上记录。提示:“The current plan is streaming. Please check the query_plan on the CN node.”。
- 对于DML语句自动提交的COMMIT,不会记录相关计划。提示:“The current record is a transaction commit of a DML statement. Please check the plan of this DML statement.”。
- 非DML/DQL语句不记录计划。提示:“Do not record plans for non-DML/DQL statements.”。对于DDL语句,在多CN集群上,query_plan会记录节点间的交互信息。
- 存储过程中未适配或没有计划的子语句,例如简单表达式、OPEN CURSOR、CLOSE以及BYPASS路径语句,不记录计划。存储过程中执行的子语句不在DN上记录计划。提示:“Statement has no plan or is unsupported for plan recording.”。
- 对于进入到PARSE阶段的SQL,还未生成计划,将不进行记录。提示:“This statement is a PARSE statement and has not yet generated a query plan.”。
- 在检查是否需要上报query_plan时,SQL语句执行并不慢,后续清理等任务影响导致SQL语句整体执行慢。提示:“Check the reported query_plan time is 2026-01-01 08:05:01.735619+08, at this time the SQL is not slow.”。
- 语句执行状态异常时,计划记录有可能失败,需要检查日志分析原因。提示:“An error occurred during statement execution. Please check the log for analysis.”。
- 其他未记录成功的场景,需要检查日志分析原因。提示:“The query plan failed to be recorded. Please check the log analysis.”。