首页 > 其他分享 >CMU 15-445(Fall 2023) Project3 Query Execution个人笔记

CMU 15-445(Fall 2023) Project3 Query Execution个人笔记

时间:2024-02-18 20:56:00浏览次数:26  
标签:child 15 Fall 445 元组 _- 算子 Next 方法

Task #1 - Access Method Executors

SeqScan算子

实现逻辑

  1. 使用exec_ctx属性获取对应的TableInfo
  2. 调用MakeIterator方法,获取表的迭代器
  3. 在Next方法中,每次利用迭代器获得一个满足条件的元组(检查元组是否被删除、元组是否满足filter)

Insert算子

实现逻辑

  1. 在Next方法中调用child_executor_->Next获取要插入的元组
  2. 使用TableHeap类的InsertTuple方法插入元组
  3. 插入索引

插入索引示例

i->index_->InsertEntry(child_tuple.KeyFromTuple(table->schema_, i->key_schema_, i->index_->GetKeyAttrs()),
                             new_rid.value(), nullptr);

Update算子

实现逻辑

  1. 在Next方法中调用child_executor_->Next获取要更新的元组
  2. 利用TableHeap类的UpdateTupleMeta方法,将对应元组标记为删除
  3. 删除对应的索引
  4. 对旧的元组执行plan_->target_expressions_中所有表达式,获取更新后的元组
  5. 插入元组以及索引

Delete算子

实现逻辑

  1. 在Next方法中调用child_executor_->Next获取要删除的元组
  2. 利用TableHeap类的UpdateTupleMeta方法,将对应元组标记为删除
  3. 删除对应的索引

SeqScan优化为IndexScan

  1. 当计划类型为PlanType::SeqScan,尝试进行优化
  2. 遍历filter_predicate_中的表达式,当满足有且只有一个索引时,构造IndexScanPlanNode并且返回

IndexScan算子

  1. 获取哈希表
htable_ = dynamic_cast<HashTableIndexForTwoIntegerColumn *>(index_info_->index_.get())
  1. 利用ScanKey方法获取对应的元素即可


Task #2 - Aggregation & Join Executors

Aggregation算子

和之前的算子不同,Aggregation算子的核心流程在Init方法中完成,而Next方法仅用于返回结果

  1. 利用child_executor_->Next方法遍历所有元组
  2. 对于每一个元组,利用InsertCombine方法将其插入到哈希表中,项目中已经提供好了MakeAggregateKeyMakeAggregateValue将元组转换为InsertCombine方法的参数

CombineAggregateValues方法实现思路

// 方法定义
void CombineAggregateValues(AggregateValue *result, const AggregateValue &input);

result参数代表最终的聚合结果,input参数代表新到的一个参与聚合的元组,要根据聚合函数以及input的值动态的修改result中的值

例如聚合函数为AggregationType::CountStarAggregat,则每执行一次CombineAggregateValues方法,result中的值就应该加一

NestedLoopJoin算子

NestedLoopJoin算子也应当在Init方法中就处理完逻辑,Next方法仅做结果的返回

  1. 将左侧执行器和右侧执行器的结果保存到两个vector中
  2. 使用一个两层嵌套循环,将满足plan_->predicate_->EvaluateJoin的元组保存到结果集合中即可
  3. 对于left join,当遍历完右侧所有元组仍然没有满足条件的元组时,需要构造空值添加进结果集

空值构造:

res.push_back(ValueFactory::GetNullValueByType(c.GetType()));



Task #3 - HashJoin Executor and Optimization

HashJoin算子

  1. 模仿项目中的SimpleAggregationHashTable构造一个用于Hash Join的SimpleHashJoinHashTable
  2. 获取左右子节点的结果集,并利用右子节点的结果集构造哈希表
  3. 遍历左子节点结果集,对于每一个元组查找哈希表并尝试进行连接即可

NestedLoopJoin优化为HashJoin

  1. 当计划类型为PlanType::NestedLoopJoin时,尝试进行优化
  2. 只有当连接条件是一个或者多个等值连接时,才应当进行优化
  3. 这里的条件表达式有两种情况,一是LogicType::And,二是ComparisonType::Equal,对于And类型表达式,需要递归的处理其子表达式
// And表达式, 需要递归的处理
if (const auto *expr = dynamic_cast<const LogicExpression *>(nlj_plan.Predicate().get());
    expr != nullptr && expr->logic_type_ == LogicType::And)
// Equal表达式
if (const auto *expr = dynamic_cast<const ComparisonExpression *>(nlj_plan.Predicate().get());
    expr != nullptr && expr->comp_type_ == ComparisonType::Equal)



Task #4: Sort + Limit Executors + Window Functions + Top-N Optimization

Sort算子

使用std::sort实现,Value类提供了CompareEqualsCompareLessThanCompareGreaterThan等方法用于比较两个值

Limit算子

使用一个计数器保存当前返回的元组数量即可

Top-N算子

使用标准库中的优先队列,插入N的元素即可

std::priority_queue<Tuple, std::vector<Tuple>, std::function<bool(const Tuple &, const Tuple &)>> pq(
      [this](const Tuple &a, const Tuple &b) {
        return false;
      });

Window Functions

  1. 利用child_executor_->Next获取所有元组并且保存
  2. 实验保证了如果有排序字段,所有窗口的排序字段是相同的,那么构造一个SortExecutor,将上一步的结果集进行排序
  3. 遍历所有的窗口函数,对于每个窗口函数,构造AggregationExecutor,计算每个窗口中的结果
  4. 将所有窗口的结果集进行组合,构造符合输出模式的元组集合

Leaderboard暂未实现

通过截图

标签:child,15,Fall,445,元组,_-,算子,Next,方法
From: https://www.cnblogs.com/fenfeng9/p/18019934

相关文章

  • 苹果iPhone手机Trollstore巨魔2必备神器Misaka.ipa签名安装支持iOS15.5~16.6.1错误如
    文末附工具链接和视频介绍引言上一篇,介绍了哪些设备可以安装巨魔2:巨魔TrollStore2已经支持更多版本和型号A12-A17今天继续实战介绍,如何在iPhone上安装巨魔TrollStore2的前置工作,通过Misaka来安装巨魔TrollStore2,先进行Misaka.ipa签名安装。Misaka支持哪些iOS版本和方式......
  • P1541 [NOIP2010 提高组] 乌龟棋题解
    有两种方法,代码注释都很详细了直接上代码一:记忆化搜索#include<bits/stdc++.h>usingnamespacestd;intt[15];intn,m;inta[400];intmp[45][45][45][45];//mp[i][j][k][l]表示1号用i张,2号用j张,3号用k张,4号用l张的情况下,最多能拿多少分intdfs(intstep,intw)//step......
  • P5478 [BJOI2015] 骑士的旅行 - 重链剖分
    首先分析一下题目,对于这棵树,操作如下:查询从X到Y的路径上的前k大的值。把$P_i$上的武力值减去一个$F_i$并在Y上的武力值加上一个$F_i$,再把$P_i$改成Y。将$P_i$上的武力值减去一个$F_i$再加上一个Y,并把$F_i$改成Y。由第一个我们可以想到,先用树剖,再用......
  • Leetcode 11-15题
    盛最多雨水的容器数组的第\(i\)个数字表示这个位置隔板的高度,选择哪两块板子可以装最多的水,返回可以存储的最大水量。有一种双指针的贪心策略:如果左边的指针所在的挡板低,就将左边的指针右移,否则将右边的指针左移。每次移动完之后,计算当前能存储的水量,并和结果值相比较。证明......
  • P5155 [USACO18DEC] Balance Beam P
    假设有一个长度为\(L\)的木块。定义\(f_i\)从\(i\)走到\(L\)的概率,有\(f_i=\dfrac{f_{i+1}+f_{i-1}}{2}\)。由\(f_1=0,f_L=1\)可以递推得出\(f_i=\dfrac{i}{L}\)。若一个节点移动的期望收益比当前点停止的收益低,则设这个点为关键点。从\(i\)出发开始移动,期望收益......
  • CF1540E Tasty Dishes
    Description初始有\(n\)个数\(a_i\),以及若干条有向边\((u_i,v_i)\),保证\(u_i<v_i\)。一轮操作会形如下面两个过程:首先\(\foralli,a_i:=\max(a_i,ia_i)\)。然后\(\foralli,a'_i:=a_i+\sum\limits_{(i,j)\inE}\max(a_j,0)\),最后\(\foralli,a_i:=a'_i\)。......
  • P1595 信封问题
    题目描述某人写了nn封信和nn个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。输入格式一个信封数nn,保证n≤20n≤20。输出格式一个整数,代表有多少种情况。输入输出样例输入#12输出#11输入#23输出#22说明/提示对于100%100%的数......
  • 2月15日总结
    问题前,不妨先问大家几个问题:为什么我们需要操作系统?操作系统的出现解决了什么问题?为什么我们的电脑软件需要运行在诸如Win、Linux、MacOS等操作系统之上?我一直主张在学一门技术之前,最好提前能搞清楚诸如这些what、why、how的东西,这比一味埋头扎进知识库去硬着头皮学某知识点,更重......
  • Codeforces(1500板刷)
    目录写在前面1.A.DidWeGetEverythingCovered?(构造、思维)题目链接题意题解代码总结2F.Greetings(离散化+树状数组)题目链接题意题解代码总结写在前面开始板刷1500了,主要是最近卡1300-1400上不去,发现cf很多思维题要不是想不到,要不就是签的慢,被读题卡了心态就巨难受,一下就......
  • P3157 [CQOI2011] 动态逆序对 题解
    题目链接:动态逆序对常见经典题,理解一个数对逆序对贡献计算即可。对于一个数而言,它在一个序列中的逆序对有两部分贡献,一部分为前面比它严格大的数,另一部分为后面比它严格小的数,有道二莫题也是基于此去考虑的。考虑最开始知道了总逆序数,每次删除一个数逆序数会减少两部分值,显然就......