开发者
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选择cursorfetch函数

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_senddml语句执行

sql_execute_dml

sql_try_execute_dml

sql_issue_dml:处理dml语句,获取根游标

sql_issue_parametered_dml:处理参数化dml语句

sql_execute_single_dml:处理单个dmlswitch


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_limitlimit查询

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

本页内容