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:获取视图信息


