#数据字典

# 数据字典类型

数据字典指YashanDB用于管理和显示数据库元数据信息的一组系统表、系统视图和动态视图。数据字典中存储了数据库中各级对象的元数据,在数据库运行的各个场景均可能被使用。

例如,YashanDB客户端工具或用户程序通过YashanDB驱动程序连接数据库时,数据库会从用户相关的数据字典中查找尝试登录的用户的身份信息(用户名、密码、角色等),从权限相关数据字典中查看该用户是否具备创建会话的权限。

当用户执行一条SQL语句,例如:

SELECT id, name FROM employees WHERE id < 100

数据库的语法解析器会解析该语句,分析出该语句试图查询employees对象,获取id、name两个字段的值。此外,数据库还需要通过数据字典确认以下信息:

  • employees对象是否存储,对象的类型是否是表或视图。
  • 当前用户是否对employees对象拥有select或read权限。
  • id,name是否为employees表的列。
  • id,name列的数据类型、长度。
  • employees表的id列是否有索引。
  • employees表的统计信息。

# 系统表

系统表由YashanDB自动维护,通常在用户执行数据声明语言(DDL)时,会引起系统表的变更。系统表中记录的信息是数据库及数据库中对象的关键元数据信息,其表结构、字段含义与YashanDB内部机制紧密相关,因此,不建议数据库管理员自行修改系统表中的数据。

# 系统视图

系统视图是基于系统表创建的一组视图,将用户关心的元数据信息以便于理解的方式进行呈现。

下表是常用的三组系统视图:

视图名称前缀 使用者 显示内容
DBA_ 数据库管理员 数据库中所有对象的元数据
ALL_ 所有用户 当前用户可访问的所有对象的元数据
USER_ 所有用户 属于当前用户模式的所有对象的元数据

# DBA视图

以DBA_开头的视图用于让拥有DBA权限的用户查看数据库中所有对象。

例如,查看数据库中所有用户的所有对象:

SELECT OWNER, OBJECT_TYPE, OBJECT_NAME FROM DBA_OBJECTS ORDER BY 1, 2, 3;

# ALL视图

以ALL_开头的视图用于让所有用户查看自己拥有访问权限的数据库对象的元数据,即从该用户视角所能看到的所有对象的元数据。

ALL_视图可以看到的对象包括:

  • 属于该用户模式的所有对象。
  • 其他用户授权该用户访问的对象,包括其他用户将访问权限授权给PUBLIC的对象。
  • PUBLIC模式下的所有对象。

例如,查看数据库中所有可以访问的对象:

SELECT OWNER, OBJECT_TYPE, OBJECT_NAME FROM ALL_OBJECTS ORDER BY 1, 2, 3;

# USER视图

以USER_开头的视图用于让所有用户查看所有者为自己的对象元数据。

USER视图返回的数据通常是ALL视图的子集,相对于ALL视图,USER视图一般没有OWNER列。

# 动态视图

动态视图是将实例、数据库运行阶段等一些未记录在系统表中的关键元数据通过内部机制以表的方式呈现出来。

例如,使用V$DATABASE查看数据库状态:

SELECT owner, object_type FROM DBA_OBJECTS WHERE object_name='V$DATABASE';

OWNER                                                            OBJECT_TYPE           
---------------------------------------------------------------- --------------------- 
PUBLIC                                                           SYNONYM    

SELECT table_owner, table_name FROM DBA_SYNONYMS WHERE synonym_name='V$DATABASE';

TABLE_OWNER                                                      TABLE_NAME                                                       
---------------------------------------------------------------- ---------------------------------------------------------------- 
SYS                                                              V_$DATABASE       

通过系统视图可以看到V$DATABASE是SYS.V_$DATABASE的一个公共同义词。

SELECT owner, text FROM DBA_VIEWS WHERE view_name='V_$DATABASE'; 

OWNER                                                            TEXT                                                             
---------------------------------------------------------------- --------------------------------------------------------------- 
SYS                                                              select "DATABASE_ID","DATABASE_NAME","CREATE_TIME","LOG_MODE","OPEN_MODE","PROTECTION_MODE","PROTECTION_LEVEL","DATABASE_ROLE","BLOCK_SIZE","CURRENT_SCN","STATUS","RCY_POINT","FLUSH_POINT","RESET_POINT","PLATFORM_NAME","HOST_NAME","RESTORE_TIME","SWITCHOVER_STATUS","SUPPLEMENTAL_LOG_DATA_MIN","SUPPLEMENTAL_LOG_DATA_PK","SUPPLEMENTAL_LOG_DATA_ALL","SUPPLEMENTAL_LOG_TABLE_TYPE" from v$database

从定义可以看到V_$DATABASE是由SYS用户定义的一个视图,其数据来源为SYS模式下的V$DATABASE对象。此处的V$DATABASE是一个动态视图,不作为记录在系统表中的模式对象,但是在实例启动、数据库加载过程中,会在内存中加载该对象的定义。

用户可以通过查询V$DYNAMIC_VIEWS视图查看所有动态视图。

# 数据字典缓存

在数据库运行过程中可能需要频繁访问数据字典,尤其是存储在系统表中的用户账号、模式对象相关的元数据,若每次访问时都只能通过扫描系统表获取数据,会严重影响系统的响应速度。

YashanDB支持数据字典缓存,在内存中以特定的数据结构对其关键元数据进行缓存。根据其使用频率、数量、内存占用大小,数据字典缓存可分为常驻缓存和动态缓存。

# 常驻缓存

对于使用频率高、数据量相对较少、占用内存较小的系统对象,缓存加载后常驻内存,例如用户账户信息。

# 动态缓存

对于数量多、内存占用较大的对象,仅在使用时动态生成缓存,例如表的元数据。当缓存内存不足时,可能暂时淘汰部分暂不使用的对象缓存。