---
title: oGRAC动态视图简介-官方技术文章-鲲鹏社区
description: 本文阐述oGRAC动态视图的实现机制。
keywords: GRAC,动态视图简介,官方技术文章,鲲鹏社区,特性场景,需求来源,数据存储,视图实现机制
url: https://www.hikunpeng.com/developer/techArticles/20260424-5?envFlag=1
section: (其他)
---

# oGRAC动态视图简介-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20260424-5?envFlag=1
描述: 本文阐述oGRAC动态视图的实现机制。
关键词: GRAC,动态视图简介,官方技术文章,鲲鹏社区,特性场景,需求来源,数据存储,视图实现机制

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

oGRAC动态视图简介

oGRAC动态视图简介

oGRAC

发表于 2026/04/24

0

# oGRAC动态视图简介

## 特性场景

- dv_dss_time_stats：数据库中的DSS设备信息都对应一行
- dv_sql_execution_plan：数据库中历史执行的每条sql都对应一行。
- dv_slow_sql：系统开启了slowsql开关，对应每个满足slowsql条件的sql对应一行。
- dv_drc_buf_info：数据库本地节点的所有缓冲区页面对应一行
- dv_drc_local_lock_info：数据库本地节点的所有锁信息对应一行
- dv_buf_ctrl_info：数据库本地节点的所有缓冲区控制块对应一行

### 需求来源：

- dv_dss_time_stats：支持数据库中的DSS设备操作统计信息收集，记录每种DSS操作的等待时间、执行次数，可以诊断存储层的I/O瓶颈和延迟问题，帮助DBA识别存储性能问题，如高延迟的读写操作
- dv_sql_execution_plan：数据库中历史执行的每条sql信息，用于SQL性能分析和优化，可通过历史数据对比不同执行计划的性能差异
- dv_slow_sql：记录执行时间超过预设阈值的慢SQL，包含SQL文本、执行时间、等待事件、锁等待等关键信息，可提供于性能优化
- dv_drc_buf_info：需要查询数据库本地节点的缓冲区页面使用情况，显示页面的状态信息，可用于内存管理分析，当出现锁定冲突或页面转换延迟时使用
- dv_drc_local_lock_info：需要查询数据库本地节点的锁使用情况，可用于帮助识别锁竞争和死锁问题
- dv_buf_ctrl_info：数据库本地节点的所有缓冲区控制块，可用于缓冲区管理和页面状态分析

### 数据存储：

- 初始化：数据库启动时通过drc_init()和buf_init()分配内存
- 运行时：首次访问页面/锁资源时创建对应条目，后续操作实时更新
- 数据位置：均存储在全局内存结构中（g_drc_res_ctx和g_dtc->kernel->buf_ctx），视图查询时直接读取这些内存结构

## 视图实现机制

### 实现流程

#### 1. 视图注册

- 通过 srv_regist_dynamic_views 函数注册所有动态视图

void srv_regist_dynamic_views(void){g_instance->kernel.dyn_views = g_dynamic_views;g_instance->kernel.dyn_view_count = SRV_DYNAMIC_VIEW_COUNT;g_instance->kernel.dyn_views_nomount = g_dynamic_views_nomount;g_instance->kernel.dyn_view_nomount_count = SRV_DYNAMIC_VIEW_COUNT_NOMOUNT;g_instance->kernel.dyn_views_mount = g_dynamic_views_mount;g_instance->kernel.dyn_view_mount_count = SRV_DYNAMIC_VIEW_COUNT_MOUNT;}

- 使用 VW_DECL 宏定义视图结构，包含名称、列定义、打开和获取函数

VW_DECL g_dss_time_stats = { "SYS",         "DV_DSS_TIME_STATS", DSS_STATS_INFO_COLS, g_dss_stats_columns,vw_common_open, dss_time_stats_fetch };VW_DECL dv_sql_execution_plan = { "SYS","DV_SQL_EXECUTION_PLAN", SQL_PLAN_COLS,g_sql_execution_plan_columns, vw_ogsql_func_plan_open, vw_fetch_sql_plan };VW_DECL dv_slowsql_view = { "SYS",           "DV_SLOW_SQL",   SLOWSQL_VIEW_COLS, g_slowsql_view_columns,vw_slowsql_open, vw_slowsql_fetch };VW_DECL g_drc_buf_info = { "SYS",         "DV_DRC_BUF_INFO", DRC_BUF_INFO_COLS, g_drc_buf_info_columns,drc_info_open, drc_buf_info_fetch };VW_DECL g_drc_local_lock_info = {"SYS",         "DV_DRC_LOCAL_LOCK_INFO", DRC_LOCAL_LOCK_INFO_COLS, g_drc_local_lock_info_columns,drc_info_open, drc_local_lock_info_fetch};VW_DECL g_buf_ctrl_info = { "SYS",         "DV_BUF_CTRL_INFO", BUF_CTRL_INFO_COLS, g_buf_ctrl_info_columns,drc_info_open, drc_buf_ctrl_fetch };

- 通过 dynview_id_t 结构体枚举定义视图标识

typedef enum en_dynview_id {......DYN_VIEW_SLOW_SQL,DYN_VIEW_SQL_EXECUTION_PLAN,DYN_VIEW_DRC_BUF_INFO,   // display master info for pages.DYN_VIEW_BUF_CTRL_INFO,  // display pages buf ctrl.DYN_VIEW_DRC_LOCAL_LOCK_INFO,DYN_VIEW_DSS_TIME_STATS,  // DSS interface time statistics} dynview_id_t;

视图定义：

VW_DECL g_drc_buf_info = {"SYS",                          // 视图所属的Schema（模式）"DV_DRC_BUF_INFO",              // 视图名称DRC_BUF_INFO_COLS,              // 视图的列数量g_drc_buf_info_columns,         // 视图的列定义数组drc_info_open,                  // 打开视图时的回调函数drc_buf_info_fetch              // 获取数据时的回调函数};

#### 2. 数据获取流程

- 视图打开 ：调用视图的 open 函数，初始化查询上下文，对于从日志获取信息的视图如dv_slow_sql视图，会调用open函数读取日志
- 数据获取 ：调用视图的 fetch 函数，从内存地址访问数据，逐行获取数据
- 数据转换 ：使用 row_assist_t 结构辅助构建结果行，将内存中的数据结构按顺序转换为在g_xxx_columns中定义的视图列数据
- 结果返回 ：将格式化的数据返回给查询客户端

### 数据获取来源

动态视图的数据获取原理主要分为三类：

#### （1）内存结构视图：直接访问系统内部的内存结构，实时反映系统状态

- dv_dss_time_stats ：通过 cm_get_dss_time_stat 函数获取DSS时间统计
- dv_drc_buf_info ：遍历 global_buf_res 中的缓冲区资源
- dv_drc_local_lock_info ：遍历本地锁映射中的锁资源
- dv_buf_ctrl_info ：遍历所有缓冲区控制块

#### （2）缓存视图 ：访问系统缓存中的数据，平衡实时性和性能

- dv_sql_execution_plan ：从SQL上下文中获取执行计划信息

#### （3）日志文件视图 ：解析日志文件，获取历史数据

- dv_slow_sql ：通过 ogsql_slowsql_load_files 加载日志文件（默认在数据库日志目录下的slowsql目录中），逐行解析

## 相关调用链

srv_dedicated_agent_entry：代理线程入口函数，处理数据库客户端连接的生命周期

srv_process_single_session：处理单个数据库会话请求

src_process_command：处理命令

srv_process_command_core：处理命令核心函数（设置cmd命令类型

g_server_cmd_handler：

...

sql_generate_select_plan:生成执行计划

...

sql_get_query_rs_type：根据执行计划设置结果集rs_type，后续根据rs_type选择cursor的fetch函数

sql_process_prepare：准备sql

...

sql_parse_dml：解析sql

og_find_then_parse_dml：查找已解析的sql

og_get_context_from_cache：从缓存查找sql

og_update_context_stat_cached：更新统计信息

og_cache_sql_context：缓存解析后的上下文

ogsql_cache_sql_ctx_final_proc：更新缓存

ogx_insert：更新上下文到sql_pool

sql_process_execute：初始化stmt

sql_execute：执行命令核心函数

sql_execute_dml_and_send：dml语句执行

sql_execute_dml：

sql_try_execute_dml：

sql_issue_dml：处理dml语句，获取根游标

sql_issue_parametered_dml：处理参数化dml语句

sql_execute_single_dml：处理单个dml，switch

sql_execute_select：处理select

-①sql_execute_select_plan：执行

-②sql_make_result_set：生成结果集

og_slowsql_should_skip_logging：判断是否跳过记录

ogsql_slowsql_record_slowsql：记录慢sql

og_slowsql_log_slow_sql_execution：记录慢sql到日志

-cm_write_slowsql_log：实际写入函数，用栈缓冲区

-cm_write_max_slowsql_log：用堆缓冲区

og_slowsql_get_slowest_sql_time：更新最长sql执行时间

sql_begin_ctx_stat：记录会话级的统计初始值

sql_end_ctx_stat：记录sql执行结束时的统计信息

sql_context_accumulate：记录sql执行信息到stmt->context->stat

sql_process_fetch

①sql_execute_select_plan：执行查询计划入口

sql_execute_query：查询入口

sql_open_query_cursor：打开查询游标

sql_open_cursors：给查询计划的所有表分配游标

sql_get_query_tables：获取查询计划所有表

sql_open_table_cursor：打开游标

sql_generate_cursor_exec_data：生成执行数据（动态视图这里都没走进去，直接返回）。初始化执行数据，分配内存

sql_execute_query_plan：执行查询计划

sql_execute_query_limit：limit查询

sql_execute_query_plan

sql_execute_scan：扫描

sql_scan_normal_table：扫描普通表

sql_execute_table_scan：执行普通表扫描

pre_set_knl_cur：

knl_open_cursor：内核打开游标，初始化游标和资源，设置内核cursor->fetch是动态视图或其他，调用open

knl_fetch_dynamic_view

knl_open_table_cursor

②sql_make_result_set：生成结果集入口，获取cursor->fetch

sql_make_normal_rs：结果集生成的循环函数

sql_fetch_func：数据获取

->sql_fetch_limit：如果有limit，会在这里判断有没有达到限值

->sql_fetch_query

sql_fetch_scan

sql_fetch_normal_scan

sql_fetch_table_scan：

sql_fetch_one_part：循环获取每个分区数据

knl_fetch：根据内核cursor获取数据

->knl_fetch_dynamic_view：循环调用fetch获取数据

->entity->dview->fetch：查询字典里的fetch函数

->drc_buf_info_fetch：获取视图信息

本页内容
