首页
学习
活动
专区
圈层
工具
发布

TiDB 源码阅读系列文章(二十一)基于规则的优化 II

因此,在聚合消除中,我们可以通过查看下层算子保存的这个信息,再结合 Group By 用到的列判断当前聚合算子是否可以被消除。...其核心思想是将 LogicalApply 的 inner plan 中包含相关列的那些算子提升到 LogicalApply 之中或之上,在算子提升后如果 inner plan 中不再包含任何的相关列,即不再引用任何...在这个例子中,子查询的过滤条件是 `t2` 表的主键上的等值条件,所以子查询肯定最多只会输出一行记录,而这个信息在“构建节点属性”这一步时会被发掘出来并记录在算子节点的 `MaxOneRow` 属性中,...这是为了在子查询中没有匹配的特殊情况下保证结果的正确性,以上面查询为例,当 `t2` 表没有任何记录满足 `t2.a = t1.pk` 时,子查询中不管是什么聚合函数都会返回 `null` 结果,为了保留这种特殊情况...,在聚合提升的同时, `LogicalApply` 的连接类型会被强制改为 left join(改之前可能是 inner join ),所以在这种没有匹配的情况下,`LogicalApply` 输出结果中

1.5K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL(九)之数据表的查询详解(SELECT语法)二

    外连接除了返回相关联的行之外,将没有关联的行也会显示出来。     为什么需要将不没关联的行也显示出来呢?...1.4.1、左外连接     格式: 表名 LEFT JOIN 表名 ON 条件;     返回包括左表中的所有记录和右表中连接字段相等的记录,通俗点讲,就是除了显示相关联的行,还会将左表中的所有记录行度显示出来...分析:suppliers表是在LEFT JOIN的左边,所以将其中所有记录度显示出来了,有关联项的,也有没有关联项的。...如果将suppliers表放LEFT JOIN的右边,那么就不会在显示80和90这两条记录了。来看看 ?   ...在合并的时候会消除重复的行,不消除重复的行,可使用union all。

    2.2K100

    新建的索引解决了问题,结论真的对吗?

    ,SQL语句中那么多做left join的表,上面为什么一个都没看到?...这是因为最后要的结果是count(1),left join的表如果关联字段都是唯一的(这个是根据执行计划判断出来的),优化器会很聪明的把这些表从执行计划中消除,结果是等价的)。...SQL中还涉及另一个字段PRB_ORG,它的选择性也不错,为10319,并且其上没有索引,经分析,建议在PRB_ORG和PRJ_SEQ上创建复合索引。...执行计划如下: 下面我们来分析一下为什么说这个索引创建的理由是错误的。 执行计划中的步骤10由原来的全表扫描变成了索引扫描,这一步是创建索引的功劳。...也就是说,原结论创建两个字段上的索引,其实只需要一个字段就够了,增加一个字段也不会提高索引在这个SQL中的选择性(有可能在其他SQL同时使用两个字段做谓词条件时是高效的)。

    31740

    数据库基础知识详解三:MVCC、范式以及表连接方式

    然后在事务A执行中间的其他操作时,事务B插入了一条新的用户数据,因为事务B的版本号为300,所以假设此时事务A查询,因为该行数据创建的版本号大于自己的版本号,所以不会被查询出。...可以通过分解来满足 2NF:将(学号,课程名,成绩)做成一张表;(学号,学生姓名)做成另一张表,避免大量的数据冗余; 满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情...第三范式(3NF):在 2NF 的基础上,非主属性不传递依赖于主属性。 传递依赖:如果C依赖于B,B依赖于A,那么C传递依赖于A。3NF在2NF的基础上,消除了非主属性之间的依赖。...修改异常:修改了一个记录中的信息,另一个记录中相同的信息却没有修改。 删除异常:删除一个信息,那么也会丢失其它信息(删除一个课程,丢失了一个学生的信息)。...示例: select * from student natural join grade; 结果: 没有给任何的条件,数据库自动把两张数据表各行有相同属性的行(元组)连接在了一起。

    66960

    Mssql常用经典SQL语句大全完整版–详解+实例

    (例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。...B: EXCEPT 运算符   EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。...C:full outer join:   全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。   ...只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。...它仅指明了指令文本仅是一条不返回任何行的指令或现存程序(如:一条只执行数据插入的指令)。如果没有任何行被提取,那么他们将放弃执行并不返回任何值。

    1.6K10

    记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题

    “欺骗”查询引擎让查询按你的期望去查询 但是为什么查询20条记录竟然要5秒呢,尤其在这个表是加上了时间索引的情况下——参考《程序猿是如何解决SQLServer占CPU100%的》中提到的索引。...把其他没参与where的表放到cte外面 根据上面的IO,很快,又有人提到,把其他left join的表放到cte外面。...那还能不能提升,这个时候,我想到了,先把addrNode、mgrobj、mgrobjtype三个表联合查询,放到一个临时表,然后再和eventlog做inner join,然后查询结果再和其他表做left...还有一些人提出,把查询出来的内容,放到一个临时表,这个临时表中的加入自增Id的索引,这样,可以通过辨别Id来进行快速刷选记录。这也是一种方法,我打算稍后尝试。...join而不是inner join的连接——left join的结果相当于没有用上addrId in ()的条件(感谢32楼夏浩) 参考文章 曲演杂坛--蛋疼的ROW_NUMBER函数 为什么超长列表数据的翻页技术实现复杂

    1.9K120

    MySQL实战第四十四讲- 要不要使用分区表?

    然后,我往两个表中都插入了 6 条记录,其中在表 a 和 b 中同时存在的数据有 4 行。...语句 Q1 返回的数据集是 6 行,表 a 中即使没有满足匹配条件的记录,查询结果中也会返回一行,并将表 b 的各个字段值填成 NULL。 2. 语句 Q2 返回的是 4 行。...这个例子说明,即使我们在 SQL 语句中写成 left join,执行过程还是有可能不是从左到右连接的。也就是说,使用 left join 时,左边的表不一定是驱动表。...在对被驱动表做全表扫描的时候,如果数据没有在 Buffer Pool 中,就需要等待这部分数据从磁盘读入; 从磁盘读入数据到内存中,会影响正常业务的 Buffer Pool 命中率,而且这个算法天然会对被驱动表的数据做多次访问...关于这部分内容的知识点请参考第35篇文章。 2. 即使被驱动表数据都在内存中,每次查找“下一个记录的操作”,都是类似指针操作。而 join_buffer 中是数组,遍历的成本更低。

    40840

    MySQL实战第四十四讲- 答疑文章:说一说这些好问题

    然后,我往两个表中都插入了 6 条记录,其中在表 a 和 b 中同时存在的数据有 4 行。...语句 Q1 返回的数据集是 6 行,表 a 中即使没有满足匹配条件的记录,查询结果中也会返回一行,并将表 b 的各个字段值填成 NULL。 2. 语句 Q2 返回的是 4 行。...图片 这个例子说明,即使我们在 SQL 语句中写成 left join,执行过程还是有可能不是从左到右连接的。也就是说,使用 left join 时,左边的表不一定是驱动表。...在对被驱动表做全表扫描的时候,如果数据没有在 Buffer Pool 中,就需要等待这部分数据从磁盘读入; 从磁盘读入数据到内存中,会影响正常业务的 Buffer Pool 命中率,而且这个算法天然会对被驱动表的数据做多次访问...关于这部分内容的知识点请参考第35篇文章。 2. 即使被驱动表数据都在内存中,每次查找“下一个记录的操作”,都是类似指针操作。而 join_buffer 中是数组,遍历的成本更低。

    41960

    老话新谈之HANA连接

    Join pruning(连接裁剪)是SAP HANA根据其信息模型中如何定义连接以及如何从信息模型查询数据的方式,从其执行计划中消除表和连接的过程。...INNER JOIN INNER JOIN只有在两个表中找到匹配的值时才会返回记录。...LEFT OUTER JOIN 根据我测试的几个查询场景,假定从模型中定义的属性视图中未选择任何列,则始终从执行计划裁剪LEFT JOIN。...通常在分析视图基础表,在属性视图中没有匹配记录的情况下定义LEFT JOIN。即使缺少主数据或者说数据不完整,也能确保返回所有的数据。...总的来说,LEFT JOIN有可能成为我们信息视图定义中最好的连接类型。但必须确保在模型用LEFT JOIN是有意义的。而有时却需要INNER JOIN来帮助排除记录。

    1.2K20

    MySQL多表查询

    ; 外连接查询: 分类: 左外连接:左外连接的结果包括LEFT JOIN子句中指定的左表的所有记录,和所有满足连接条件的记录。...如果左表的某条记录在右表中没有匹配,则在右表中显示为空。(在左表的基础上,符合条件的右表的数据,也就是交集部分)。...*,t2.name from emp t1 left join dept t2 on t2.dept_id = t2.id; 右外连接:右外连接与左外连接正好相反,返回右表中所有指定的记录和所有满足连接条件的记录...如果右表的某条记录在左表中没有匹配,则左表将返回空值。 (在右表的基础上,符合条件的左表的数据,也就是交集部分)。...ANY(SOME) :对于子查询返回的列中的任何一个数值,如果比较结果为TRUE,就返回TRUE。

    3.8K10

    数据库三范式

    其他属性是否依赖于这个主键?...因此最好的做法是将城市相关的属性分离到一个城市信息表中。 二、为什么需要范式? 数据库范式为数据库的设计、开发提供了一个可参考的典范,在许多教学材料中也是作为关键的课程内容。...第三范式,要求没有间接依赖于主键的列,即仍然是希望消除表中冗余的列。 比如用户表中不需要存储额外的 其所在城市的人口、城市特点等信息。...然而现有的项目应用并不会完全遵循范式的理念,原因在于: 性能原因,没有任何冗余的表设计会产生更多的查询行为,这意味着会产生更多次的数据库IO操作。在一些实时交互的系统中,可能会慢得让人难以忍受。...当然,你可以使用数据库的 连接(join) 操作,而事实上数据库提供 join 也就是为了来缓解这种问题。但一旦用到了分库分表方案的面前,这个问题就会非常的棘手。

    55910

    Apache-Flink深度解析-JOIN 算子

    本篇将详尽的为大家介绍传统数据库为什么需要JOIN算子,以及JOIN算子在Apache Flink中的底层实现原理和在实际使用中的优化!...JOIN的本质是分别从N(N>=1)张表中获取不同的字段,进而得到最完整的记录行。...为啥需要JOIN JOIN的本质是数据拼接,那么如果我们将所有数据列存储在一张大表中,是不是就不需要JOIN了呢?...简说NF如下: 1NF - 列不可再分; 2NF - 符合1NF,并且非主键属性全部依赖于主键属性; 3NF - 符合2NF,并且消除传递依赖,即:任何字段不能由其他字段派生出来; BCNF - 符合...的结果我们发现少了Tom同学的成绩,原因是Tom同学没有参加考试,在score表中没有Tom的成绩,但是我们可能希望虽然Tom没有参加考试但仍然希望Tom的成绩能够在查询结果中显示(成绩 0 分),面对这样的需求

    1.9K30
    领券