pla

揭秘 TiDB 新优化器:Cascades Planner 原理解析

心不动则不痛 提交于 2019-11-29 08:07:39
作者:MingCong Han 在《 十分钟成为 Contributor 系列 | 为 Cascades Planner 添加优化规则 》中,我们简单介绍了 Cascades 的相关背景知识,本文将为大家深入介绍 TiDB 新的优化器——Cascades Planner 的框架及原理。 TiDB 当前优化器简介 关系型数据库中查询优化器的作用是为一个 SQL 在合理的开销内产生一个合适的查询计划, TiDB 源码阅读系列文章(六)Select 语句概览 中介绍过 TiDB 当前优化器的基本组成,TiDB 当前的优化器将优化过程主要分为逻辑优化(Logical Optimize)和物理优化(Physical Optimize)两个阶段。逻辑优化是将一棵逻辑算子树(LogicalPlan Tree)进行逻辑等价的变化,最后的结果是一棵更优的逻辑算子树;而物理优化则是将一棵逻辑算子树转换成一棵物理算子树(PhysicalPlan Tree)。这棵物理算子树就是我们说的物理执行计划,将交由 TiDB 执行引擎去完成后续的 SQL 执行过程。 逻辑优化 TiDB 中,一个 SQL 在进入到逻辑优化阶段之前,它的 AST(抽象语法树)已经转换成了对应的逻辑算子树,因此逻辑优化就是将一个逻辑算子树进行逻辑上等价变换的过程。逻辑优化是基于规则的优化(Rule-Based Optimization

BZOJ1113: [Poi2008]海报PLA

好久不见. 提交于 2019-11-28 07:29:39
Description N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. Input 第一行给出数字N,代表有N个矩形.N在[1,250000] 下面N行,每行给出矩形的长与宽.其值在[1,1000000000]2 1/2 Postering Output 最少数量的海报数. 题解:先假设一共盖住一个矩形需要一张海报,那么需要n张海报。再思考什么情况可以减少海报的数量。 如果两个房子登高,两个房子中间的房子都要高于这两个房子,那么显然可以用一张海报完全遮盖住这两 栋房子,这个过程我们可以用单调栈维护单调性,在弹栈操作时实现这一思想。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 int s[250005],top,n; 9 10 int main() 11 { 12 scanf("%d",&n); 13 int w,h,ans=n; 14 for(int i=1;i<=n;i++) 15 { 16 scanf("%d%d",&w,&h); 17 while(s[top]>=h) 18 { 19 if(s[top]>h) top--; 20 else top--,ans--; 21 } 22

【52】写了placement new也要写placement delete

醉酒当歌 提交于 2019-11-27 01:19:32
1、Widget* pw = new Widget; 调用了两个方法:第一个方法是operator new 负责分配内存;第二个方法是在分配的内存上构造Widget,即调用Widget的default构造方法。 2、那么问题来了,如果operator new分配内存成功,而Widget构造抛出异常,这种情况下,pw还没有赋值,这不就导致资源泄露了?   不会造成资源泄露,因为C++运行系统保证调用delete释放资源。 3、正常的operator new 如下:   void* operator new(std::size_t) throw (std::bad_alloc);   正常的operator delete如下:   void operator delete (void* rawMemory) throw(); // global作用域中的正常签名式   void operator delete (void* rawMemory,std::size_t size) throw (); //class 作用域中典型的签名式   除了上面的operator new,还有重载operator new,这些重载的new称为placement new,其中有一个比较特殊的,如下:   void* operator new (std::size_t, void* pMemory)