首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

另外提一点,对于大部分聚合函数,参数类型返回结果类型一般是不同,所以在展开聚合函数时候一般会在参数列上构造 cast 函数做类型转换,展开后表达式会保存在作为替换 LogicalAggregation...TiDB 会在 expressionRewriter 逻辑做两类操作: 子查询展开 即直接执行子查询获得结果,再利用这个结果改写原本包含子查询表达式;比如上述非相关子查询,如果其返回结果为一行记录...LogicalApply 算子是一类特殊 LogicalJoin ,特殊之处体现在执行逻辑上:对于 outer plan 返回每一行记录,取出相关列具体传递给子查询,再执行根据子查询生成 inner...当 `t1.pk` 满足唯一性后,每一行 outer plan 记录都对应连接结果一个分组,所以其聚合结果会和在子查询聚合结果一致,这也解释了为什么聚合提升后需要按照 `t1.pk` 做分组。...这是为了在子查询没有匹配特殊情况下保证结果正确性,以上面查询为例,当 `t2` 表没有任何记录满足 `t2.a = t1.pk` 时,子查询不管是什么聚合函数都会返回 `null` 结果,为了保留这种特殊情况

1.3K40

查询注意事项&semi-join(2)—mysql基于规则优化(四十五)

查询又分为相关和不相关子查询,如果子查询过滤条件里有外层查询参数,则是相关子查询,反之则是不相关子查询。...key3 = s2.key3 LIMIT 1); 这种相关子查询也和我们前面想一样: 外层获取一条记录,用于s2.key3。...写入临时表而且会通过唯一索引去重,如果超过了tmp_table_size则会创建物理磁盘临时表,索引类型也会变为b+树索引。...Table pullout(子查询表上拉) 当子查询查询列表处只有主键和唯一索引时候,直接上拉转换一下就好, SELECT * FROM s1 WHERE key2 IN (SELECT...aa,aa,aa,ab,ab,ab,bb,bb,bb,只需要在s1表s1.key3 = ‘aa’,只需要取相同第一个记录放入结果集,这种取值方式就是松散扫描。

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

条件简化&子查询(1)--Mysql基于规则优化(四十四)

(虽然没查,但怎么知道有多少数据呢,别忘了我们在查询之前计算成本会用到数据统计,但innoDB查询出来不准确,是估,所以这里一条只使用memory和myISAM) 使用主键等值匹配或者唯一二级索引等值匹配查询表...按返回结果集区分子查询 因为子查询本身也是查询,可以吧子查询返回不同数据分为不同查询类型。...IN (SELECT m2, n2 FROM t2); 按照外层关系来区分子查询 不相关子查询:如果子查询结果不依赖外层查询,就叫不相关子查询。...我们前面的都是不相关子查询。 相关子查询:如果依赖外层查询,就叫相关子查询。...FROM t1 WHERE EXISTS (SELECT 1 FROM t2); 对于子查询来说,我们并不关系子查询返回结果集,我们关系是子查询结果集是否存在记录,只要子查询记录,那么整个表达式就是

43720

MySQL 相关子查询

number_of_subquery_evaluations 表示子查询执行次数,因为对于主查询满足 city_id < 100 每一条记录,相关子查询都要执行一次,所以,这个字段等于 parent_fanouts.fanout...其中 0.1 是从主查询读取一条记录之后,拿到 city_id 字段,去临时表查询记录成本常数,可以通过以下 SQL 获取: SELECT cost_name, cost_value, default_value...8 如果执行子查询查到了记录,说明主查询记录满足 city_id < 100 和 EXISTS 子查询两个条件,把主查询记录返回给客户端,否则,回到步骤 1。...总结 本文主要介绍了以下内容: 不相关子查询转换为相关子查询之后,explain 结果: 子查询 type 列 unique_subquery 是 eq_ref 别名;index_subquery...子查询 ref 列会显示为 func,这是因为主查询 IN 条件字段和子查询 select 子句字段组成新条件,IN 条件字段引用了主查询字段,而不是直接使用主查询字段。

48530

面试过程Mysql数据库常被问到问题详解

定义:主键–唯一标识一条记录,不能有重复,不允许为空 外键–表外键是另一表主键,外键可以有重复,可以是空 索引–该字段没有重复,但可以有一个空 作用:主键–用来保证数据完整性 外键–用来和其他表建立联系用...(1)非相关子查询是独立于外部查询查询,子查询总共执行一次,执行完毕后将传递给外部查询。 (2)相关子查询执行依赖于外部查询数据,外部查询执行一行,子查询就执行一次。...因此非相关子查询比相关子查询效率高 char 和 varchar 区别? char 是一种固定长度类型,varchar 则是一种可变长度类型。...区别: char (M) 类型数据列里,每个都占用 M 个字节,如果某个长度小于 M,MySQL 就会在它右边用空格字符补足。(在检索操作那些填补出来空格字符将被去掉)。...varchar (M) 类型数据列里,每个只占用刚好够用字节再加上一个用来记录其长度字节(即总长度为 L+1 字节)。 Mysql 存储引擎,myisam 和 innodb 区别。

62630

关于 SQLite EXISTS 与 NOT EXISTS

关子查询:子查询查询条件依赖于外层父查询某个属性称为相关子查询,带EXISTS 查询就是相关子查询。...EXISTS表示存在量词:带有EXISTS查询返回任何记录数据,只返回逻辑“True”或“False”。...相关子查询执行过程:先在外层查询取“学生表”第一行记录,用该记录相关属性(在内层WHERE子句中给定)处理内层查询,若外层WHERE子句返回“TRUE”,则这条记录放入结果表。...然后再取下一行记录;重复上述过程直到外层表记录全部遍历一次为止。 Exists:若子查询结果集非空时,返回“True”;若子查询结果集为空时,返回“False” 。...NOT EXISTS :若子查询结果为空,返回“TRUE”;若子查询结果集非空时,返回 “FALSE。  嘿嘿嘿好理解多了吧!!!!!!!

94310

MySQL 不相关子查询怎么执行?

查询记录都写入临时表之后,从主查询记录拿到 sub_field 字段,去临时表查找,如果找到了记录,sub_field 字段条件结果为 true,否则为 false。...主查询所有 where 条件都判断完成之后,如果每个 where 条件都成立,记录就会返回给客户端,否则继续读取下一条记录。...使用临时表存放子查询结果,是为了提升整个 SQL 执行效率。如果临时表记录数量很多,根据主查询字段去临时表查找记录成本就会比较高。...所以,MySQL 还会为临时表字段创建索引,索引作用有两个: 提升查询临时表效率。 保证临时表记录唯一性,也就是说创建索引是唯一索引。...由上所述,总结一下 MySQL 优化逻辑: 对于包含子查询 where 条件字段,如果连续几条记录字段都相同,这组记录,只有第一条记录会根据 where 条件字段去临时表查找是否有对应记录

1.9K10

2019-PHP面试题大全【数据库部分】

主键、外键和索引区别 定义: 主键–唯一标识一条记录,不能有重复,不允许为空 外键–表外键是另一表主键, 外键可以有重复, 可以是空 索引–该字段没有重复,但可以有一个空...(1)非相关子查询是独立于外部查询查询,子查询总共执行一次,执行完毕后将传递给外部查询。 (2)相关子查询执行依赖于外部查询数据,外部查询执行一行,子查询就执行一次。...因此非相关子查询比相关子查询效率高 15.char和varchar区别? char是一种固定长度类型,varchar则是一种可变长度类型。...区别: char(M)类型数据列里,每个都占用M个字节,如果某个长度小于M,MySQL就会在它右边用空格字符补足。(在检索操作那些填补出来空格字符将被去掉)。...varchar(M)类型数据列里,每个只占用刚好够用字节再加上一个用来记录其长度字节(即总长度为L+1字节)。 16.Mysql 存储引擎,myisam和innodb区别。

49320

Mysql 令人稀里糊涂Explain

key2 ; 连接查询执行计划,出现在前边表表示驱动表,出现在后边表表示被驱动表 ---- id 查询语句中每出现一个SELECT关键字,设计MySQL大叔就会为它分配一个唯一id...对于包含子查询查询语句来说,就可能涉及多个SELECT关键字,所以在包含子查询查询语句执行计划,每个SELECT关键字都会对应一个唯一id: explain select * from s1...临时表也是表,只要为记录所有列建立主键或者唯一索引就好了 跟UNION对比起来,UNION ALL就不需要为最终结果集进行去重,它只是单纯把多个查询结果集中记录合并成一个并返回给用户,所以也就不需要使用临时表...如果子查询不依赖外层查询,那么该子查询为不相关子查询,否则为相关子查询。...类似,只不过访问子查询表时使用是普通索引 这里针对是子查询返回列是唯一索引还是普通索引 range : 如果使用索引获取某些范围区间记录,那么就可能使用到range访问方法 index

22950

这是我见过最有用Mysql面试题,面试了无数公司总结(内附答案)

18.所有不同类型索引是什么? 索引有三种类型 1.唯一索引:唯一索引通过确保表没有两行数据具有相同键值来帮助维护数据完整性。定义主键时,可以自动应用唯一索引。...数据库查询可以是选择查询或动作查询。 24.什么是子查询? 子查询是另一个查询SQL查询。它是Select语句子集, 其返回用于过滤主查询条件。 25.子查询类型是什么?...子查询有两种类型: 1.关联:在SQL数据库查询,关联查询是使用外部查询来完成查询。因为相关子查询要求首先执行外部查询,所以相关子查询必须为外部查询每一行运行一次。...临时表是用于临时存储数据临时存储结构。 30.如何避免查询重复记录? SQL SELECT DISTINCT查询仅用于返回唯一。它消除了所有重复。...让我们看一下重要SQL查询以进行面试 76.如何从表获取唯一记录

27K20

mysql日常面试题总结

如果能确定某个数据列将只包含彼此各不相同,在为这个数据列创建索引时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录唯一性。...主键,是一种特殊唯一索引,在一张表只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。...SQL语句中‘相关子查询’与‘非相关子查询’有什么区别? 答:子查询:嵌套在其他查询查询称之。 子查询又称内部,而包含子查询语句称之外部查询(又称主查询)。...所有的子查询可以分为两类,即相关子查询和非相关子查询 (1)非相关子查询是独立于外部查询查询,子查询总共执行一次,执行完毕后将传递给外部查询。...(在检索操作那些填补出来空格字符将被去掉)在varchar(M)类型数据列里,每个只占用刚好够用字节再加上一个用来记录其长度字节(即总长度为L+1字节).

60820

SQLEXISTS使用

大家好,又见面了,我是你们朋友全栈君。 1.简介 不相关子查询:子查询查询条件不依赖于父查询称为不相关子查询。...相关子查询:子查询查询条件依赖于外层父查询某个属性称为相关子查询,带EXISTS 查询就是相关子查询 EXISTS表示存在量词:带有EXISTS查询返回任何记录数据,只返回逻辑“True...:先在外层查询取“学生表”第一行记录,用该记录相关属性(在内层WHERE子句中给定)处理内层查询,若外层WHERE子句返回“TRUE”,则这条记录放入结果表。...然后再取下一行记录;重复上述过程直到外层表记录全部遍历一次为止。 EXISTS语句不关心子查询具体内容,因此用“SELECT *”,“Exists + 子查询”用来判断该子查询是否返回记录。...NOT EXISTS :若子查询结果为空,返回“TRUE”;若子查询结果集非空时,返回 “FALSE。

1.1K10

mysql 优化面试题

如果能确定某个数据列将只包含彼此各不相同,在为这个数据列创建索引时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录唯一性。...主键,是一种特殊唯一索引,在一张表只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。...SQL语句中‘相关子查询’与‘非相关子查询’有什么区别? 答:子查询:嵌套在其他查询查询称之。 子查询又称内部,而包含子查询语句称之外部查询(又称主查询)。...所有的子查询可以分为两类,即相关子查询和非相关子查询 (1)非相关子查询是独立于外部查询查询,子查询总共执行一次,执行完毕后将传递给外部查询。...(在检索操作那些填补出来空格字符将被去掉)在varchar(M)类型数据列里,每个只占用刚好够用字节再加上一个用来记录其长度字节(即总长度为L+1字节).

54240

SqlServerExists使用

大家好,又见面了,我是你们朋友全栈君。 1、简介 不相关子查询:子查询查询条件不依赖于父查询称为不相关子查询关子查询:子查询查询条件依赖于外层父查询某个属性称为相关子查询。...带Exists查询就是相关子查询 Exists表示存在量词:带有Exists查询返回任何记录数据,只返回逻辑“True”或“False” 2、表结构 选课表:学号StudentNo、课程号...:先在外层查询取“学生表”第一行记录,利用该记录相关属性(在exists子查询where子句中用到列)处理内层查询,若外层where子句返回“true”,则本条记录放入结果表。...然后再取下一行记录,重复上述过程直到外层表遍历完毕。 Exists语句不关心子查询返回具体内容,因此用“exists(select 1 from)”来判断子查询是否返回记录。...exists()为true,说明选课表找不到“S1.StudentNo + C1.CourseNo”这一记录,说明学生S1没有选课程C1,此时内层查询返回结果集会加上C1,当内层查询返回结果集不为空时

56210

数据库复习资料整理

关键字(key):能唯一标识文件每条记录字段或字段集,称为记录关键字,或者简称为键。...审计功能是一种监视措施,它把用户对数据库所有操作自动记录下来,存入审计日志 记录内容一般包括:操作类型查询、插入、更新、删除),操作终端标识与操作者标识,操作日期和时间,操作所涉及相关数据,...2、不相关子查询:不相关子查询处理一次完成,执行后传递给外部查询。 二、依赖不同 1、相关子查询:相关子查询查询条件取决于外部查询。...2、不相关子查询:无关子查询是独立于外部查询查询,不依赖于外部查询。 三、效率不同 1、相关子查询:相关子查询可以嵌套在多个层,但嵌套层越多,效率越低。...如果记录操作是插入操作,则对其执行删除操作;如果记录操作是删除操作,则对其执行插入操作;如果记录操作是修改操作,则用修改前代替修改后

20210

浅析公共GitHub存储库秘密泄露

搜索API是一个灵活、功能强大工具,但它确实有两个限制必须解决:不支持正则表达式并对调用率和结果计数设置限制。查询搜索API需要两个参数:查询字符串和排序类型。...这些查询在附录表V显示。对于sort类型参数,总是使用sort=indexed返回最近索引结果,以确保收到实时结果。...从这些结果中排除了.gitignore文件,因为它们很少包含秘密,但占搜索结果很大比例。对于每个查询,API都返回一组文件及其元数据。然后对API内容端点执行另一个请求,以获取文件内容。...在收集方法每个步骤详细描述了文件数量,最终得到发现唯一秘密总数。在这里将“唯一”秘密称为在数据集中至少出现一次秘密;请注意,唯一秘密可能出现多次。 GitHub搜索API。...在2018年4月4日对单个GitHub每周BigQuery快照执行了查询,能够扫描3374973仓库2312763353个文件内容(第1B阶段)。

5.6K40

Explain使用心得

Const效率是最块,成本可以忽略不计,主要通过主键或者唯一查询sql。...Ref代表用是索引b+tree查询时候,比如用连接查询时候,连接查询条件是索引唯一,这时候还分为eq-ref,er-ef是当被驱动表查询是主键或者唯一二级索引时候,这时候就是显示eq-ref...以及还有相关子查询union和不相关子查询。还有from后面连接select派生查询,derived。当吧子查询物化后,子查询在与外部链接,这时候就是物化查询。...当union联合查询时候,这种是表示驱动表扇出,被驱动表满足百分之10数据,和rows组合可以计算出扇出。...Extra顾名思义,记录额外数据地方,比如sql里面没有写表,会显示no table,当有函数max,min时候也会显示,当覆盖索引时候,显示useing index。

30120

数据库实验报告

(数据类型错误,key键是否唯一,数据取值是否在规定范围内等) 3.学会用外部键处理数据。 三、【实验过程】 一、数据类型错误,key不是唯一,或数据超过规定长度:都是常见数据库错误。...因此这个数据类型字段能够存放这条记录最后被修改时间,而不是真正来存放时间。...定点数(decimal): decimal(m,d) 定点类型,浮点型在数据库存放是近似,而定点类型在数据库存放是精确。...:不相关子查询(干完就跑路)、相关子查询(交错互通,内层查询都要看一下外层查询,外层查询都要看一下内层查询) #不相关子查询(干完就跑路)in(…) #一个 ‘=’;多个 ‘in’或’=ANY’ #...它与前面的普通索引类似,不同就是:索引列必须唯一,但允许有空

19810

BigQuery:云中数据仓库

使用BigQuery数据存储区,您可以将每条记录放入每个包含日期/时间戳BigQuery。...这实际上是Dremel和BigQuery擅长,因为它为您提供了SQL功能,例如子选择(功能),这些功能在NoSQL类型存储引擎通常找不到。...您ETL引擎通常必须注意何时去插入新事实或时间维度记录,并且通常包括“终止”记录历史记录集谱系当前记录前一个记录。...这使得存储在BigQueryFCD模式模型与用于管理时间维度SCD模型变得相同,但是存在一个问题。ETL过程必须维护BigQuery端存在记录“Staging DW”。...这种FCD总体方法对于建模ERP类型数据来说非常有用,例如,在记录有生效和终止日期(effective and termination)情况下,以及追踪变化至关重要情况下。

5K40

T-SQL基础(三)之子查询与表表达式

查询 在嵌套查询,最外面查询结果集返回给调用方,称为外部查询。嵌套在外部查询查询称为子查询,子查询结果集供外部查询使用。 根据是否依赖外部查询,可将子查询分为自包含子查询和相关子查询。...自包含子查询不依赖外部查询,相关子查询则依赖外部查询。 子查询结果是在运行时计算查询结果会跟随查询变化而改变。子查询可以返回单个(标量)、多个或者整个表结果。...dbo.Customers AS C ORDER BY C.custid ); 上述查询语句看起来可以正常运行,但当子查询返回结果集中包含NULL时,上述查询语句则不会返回任何数据。...子查询很有可能无意中包含了外部查询列名导致子查询有自包含子查询变为相关子查询而引发逻辑错误。 为避免上述错误,查询列名尽可能使用完全限定名:[表名].[列名]。...所有列必须显式指定名称 所有列名必须唯一 表表达式分为:派生表、公用表表达式、视图三种类型。其中,派生表与公用表表达式只适用于单语句范围,即,只存在于当前查询语句中。视图则可以被多条查询语句复用。

1.6K40
领券