暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

OceanBase系统架构视图的数据操作和数据访问

2023-12-17
461

因为视图是从表中派生出来的,所以它和表有很多相似之处。用户可以查询视图,并且在一定限制下,对视图执行 DML 操作。对视图执行的操作会影响视图的某些基表中的数据,并受基表的完整性约束和触发器的约束控制。

如下示例中,在表 employees 上定义视图 staff_dept_10。这个视图定义了部门是 10 的员工信息。使用关键字 CHECK OPTION 创建视图,表明该视图上的 DML 操作只能作用在视图所定义的数据中。因此,可以插入部门为 10 中的员工的行数据,但不能插入部门为 30 中的员工的行数据。

CREATE VIEW staff_dept_10 AS
SELECT employee_id, last_name, job_id, manager_id, department_id
FROM   employees
WHERE  department_id = 10
WITH CHECK OPTION CONSTRAINT staff_dept_10_cnst;


OceanBase 数据库会在内部的数据字典中保存视图对应的查询语句。

当用户尝试通过视图读取数据时,OceanBase 数据库会执行以下操作步骤:

  1. 解析用户查询,如果在解析过程中遇到视图名称时,从数据字典中获取视图对应的查询语句并解析。

  2. 尝试将该视图与用户查询合并,合并之后有可能生成更好的执行计划。

  3. 生成执行计划,并执行该语句。

示例:

  1. 创建一个名为 staff_dept_10 的视图,该视图的定义如下所示。

    CREATE VIEW staff_dept_10 AS
    SELECT employee_id, last_name, job_id, manager_id, department_id
    FROM   employees
    WHERE  department_id = 10
    
  2. 用户执行以下查询访问 staff_dept_10

    SELECT last_name FROM  staff_dept_10 WHERE  employee_id = 200;
    
  3. OceanBase 数据库首先会将以上查询解析成如下查询。

    SELECT last_name 
    FROM   (SELECT employee_id, last_name, job_id, 
                           manager_id, department_id
                                    FROM   employees
                                    WHERE  department_id = 10) staff_dept_10
    WHERE  employee_id = 200;
    
  4. 查询改写会尝试将视图定义与主查询合并。

    SELECT last_name 
    FROM  employees
    WHERE  employee_id = 200 and department_id = 10;
    
  5. OceanBase 数据库的 SQL 引擎会生成以上 SQL 对应的执行计划并执行。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论