6.1 定义物理计划

概述

这部分内容大多来自于《数据库系统实现(第二版)》第四章 查询执行

查询编译预览:

  1. 分析,建立查询的分析树
  2. 查询重写,分析树被转化为出事查询计划,这种查询计划通常是查询的代数表达式。然后初始查询计划被转化为一个预期所需要的执行时间较小的等价的计划。(关系代数的优化)
  3. 物理计划生成,通过为 2. 中抽象的查询计划,既通常所谓逻辑查询计划的每一个操作符选择实现算法并选择这些操作符的执行顺序,逻辑计划被转化为物理查询计划。与分析结果和逻辑计划一样,物理计划用表达式树来表示。物理计划还包含了许多细节,如被查询的计划是怎样被访问的,以及一个关系何时或是是否应当被排序

2和3部分常被成为查询优化器

example:

select sno,sname from student,sc where student.sage>19 join sc on sc.sno=student.sno

        //1.                      //2.条件下移
        project                    project
           |                         |
    student.sage>19   ==>          join
           |                        / \
         join         student.sage>19 sc
          /\                      |
   student  sc                 student


    //3.物理查询树
                physical_scan_project
                        |
            physical_scan_join_nest_loop
                    /      \
    physical_scan_select  physical_scan_table
            |
    physical_scan_table   

物理查询计划操作符

物理查询计划是由操作符构成的,一个操作符对应一个计划中的一步。物理操作符通常是一个关系代数操作符的特定实现。但是,我们也需要物理操作符来完成一些与关系代数操作符无关的任务。例如我们经常需要扫描 一个表。

物理查询计划包含了表扫描、嵌套循环、投影、选择、排序合并连接、索引连接、哈希连接等操作。

主要函数

physical_scan physical_scan_generate(dongmendb db, SRA_t sra, transaction tx)

传入数据库结构体,SRA_T关系代数结构体,transaction事务结构体。之后函数内部通过解析 sra 相应的物理计划(一切物理计划都是基于表扫描)

Expression physical_scan_evaluate_expression(Expression expr, physical_scan scan, variant var)

计算后序表达式的值,并将表达式的值和值的类型存入到variant结构体中

physical_scan plan_execute_select(dongmendb db, SRA_t sra, transaction tx)

执行select语句的物理计划

int plan_execute_insert(dongmendb db, char tableName, arraylist fieldNames, arraylist values, transaction *tx)

执行insert语句的物理计划

int plan_execute_create_table(char tableName, table_info tableInfo, transaction *tx)

执行create table 语句的物理计划(实际代码写在了shell.c中)