「数据库」 查询处理与查询优化

Posted by Dawn-K's Blog on June 4, 2020

查询处理与查询优化

B+树

B+树的优势:

  1. 单一节点存储更多的元素, 使得查询的IO次数更少.

  2. 所有查询都要查找到叶子节点, 查询性能稳定.

  3. 所有叶子节点形成有序链表, 便于范围查询.

搜索

条件表达式的几种情况 C1: 无条件 C2: Sno = ‘2011003’; (搜索主键) C3: Sdept = ‘CS’; C4: Sage > 20; C5: Sdept = ‘CS’ and Sage > 20; 假设Students关系的信息如下 Students的记录数:n1 Students所占的磁盘块数: b1

线性搜索

适用于任何文件 不要求有序 不要求构建索引 不限制选择运算的条件 选择运算的时间代价(连续存放):

1
 b1 *tT + tS

tT: 磁盘传输数据的平均时间 tS: 磁盘块平均访问时间(理解为寻找磁盘块的时间, 因为是顺序查找, 只需要找到起始块即可(或许更深层次的理解是CPU寻址时间?))

二分

等值条件 文件按查询属性排序 不需要索引 针对文件的磁盘块进行 (注: 没说连续)

选择运算的时间代价: ceil(log2(b1)) * (tT + tS)

聚簇索引(S3/S4)

1
2
记录连续,一次定位,然后b组传输
 h * (tT + tS) + tS + b *tT

辅助索引(S3/S4)

1
2
记录不连续,每次传输都要重新定位
     h * (tT + tS) + n * (tT + tS) 

合取选择查询

  1. 利用索引找到符合各个条件的元组指针,取指针的交集
  2. 找到符合第一个条件的元组指针,在此范围内检查另一条件是否满足

析取选择查询

  1. 每个条件属性上都有索引->利用索引找到符合各个条件的元组指针->取指针的并集
  2. 否则线性扫描

连接

  1. 嵌套循环连接

    最好:(b1 + b2)tT+2tS 最坏:(b1 + n1 b2)*tT+(n1 + b1)tS

    小关系作为外循环表

  2. 索引嵌套循环连接

    最好:b1tT+tS +n1c 最坏:b1(tT+tS) +n1*c

  3. 归并连接

    (b1 + b2) *tT + (ceil(b1/bb)+ ceil(b2/bb))tS

  4. 散列连接

    3(b1 + b2)

  5. 混合散列连接

    b1 + b2块传输

执行开销

第八章直播第50页

前提: 1k个 Student 1w个 SC

连接+内存到硬盘+选择操作(根据执行顺序不用, 计算的顺序也不同)

  1. 笛卡尔积

    硬盘->内存 内存->硬盘(将笛卡尔积的中间结果按块写入硬盘) 选择操作(即载入中间结果(我的理解是遍历中间结果,耗时和内存->硬盘一样多,本质上就是又把内容读了一遍))

  2. 自然连接

    硬盘->内存 内存->硬盘(将自然连接的中间结果按块写入硬盘) 选择操作(同上)

  3. 先选择后连接

    硬盘->内存(实际上先只读取SC) 然后投影几乎不花时间(因为都在内存中) 然后读取Students

主要包括 集中式数据库

1
总代价 = I/O代价 + CPU代价 +内存代价

分布式数据库

1
总代价 = I/O代价 + CPU代价 + 内存代价 + 通信代价