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

Hive优化器原理与源码解析系列--优化规则FilterReduceExpressionsRule(二十二)

它们是从输入关系表达式和关系运算符推断出来的。 例如,如果将Filter(x>1)应用于谓词y的关系表达式,则过滤器的上拉谓词为[y1]。 推断谓词:仅适用于联接。...如果联接的左输入上有谓词,并且该谓词位于联接条件中使用的列上,则可以在联接的右输入上推断谓词。(反之亦然。)...恒为true,则移除此Filter谓词。...如果reduced=true,即已缩减谓词表达式,返回表达式是否仅为可为空的而强制转换Cast转换,则只取方法的第一个操作数,即移除cast不必要的转换。...对于一个静态模式Schema系统,Schema信息是从输入RelNode获取的,一个总是为False或NUll的Filter总是被一个不产生任何记录值操作符替代。

84320

《SQLSERVER2012之T-SQL教程》T-SQL单表查询(二)「建议收藏」

ISNULL函数可以接收两个参数作为输入,并返回第一个非NULL的参数值,如果两个参数值均为NULL,则返回NULL。...例如,ISNULL(col1,”),如果col1值不是NULL的话,那么返回col1,如果col1是NULL的话,则返回空字符串。...TRUE、FALSE和UNKNOWN,T-SQL遵循这方面的标准。 逻辑表达式仅涉及已有或是现值,其计算结果为TRUE或FALSE,但当逻辑表达式涉及NULL时,其计算结果为UNKNOWN。...同样,如果谓词salary>0出现在表的CHECK约束中,所有行的表达式计算为TRUE的INSERT或UPDATE语句会被接收,而那些计算结果为FALSE的会被拒绝。...接下来看看表达式计算结果为UNKNOWN的处理方式。对于查询筛选而言,SQL的正确处理定义是接收TRUE,意味着FALSE和UNKNOWN会被筛选掉。

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

    GROUP BY 后 SELECT 列的限制:which is not functionally dependent on columns in GROUP BY clause

    0,产生一个warning; 2、Out Of Range,变成插入最大边界值; 3、当要插入的新行中,不包含其定义中没有显式DEFAULT子句的非NULL列的值时,该列缺少值; 解决步骤 MySQL...sql_mode 模式参数是不一样的,5.6的mode是NO_ENGINE_SUBSTITUTION,其实表示的是一个空值,相当于没有什么模式设置,可以理解为宽松模式。...谓词逻辑中,根据输入值的阶数对谓词进行分类。...= 或者 BETWEEEN 等输入值为一行的谓词叫作"一阶谓词",而像 EXISTS 这样输入值为行的集合的谓词叫作"二阶谓词"(HAVING 的输入值也是集合,但它不是谓词)。...以此类推,三阶谓词=输入值为"集合的集合"的谓词,四阶谓词=输入值为"集合的集合的集合"的谓词,但是 SQL 里并不会出现三阶以上的情况,所以不用太在意。

    3.2K50

    神奇的 SQL 之温柔的陷阱 → 三值逻辑 与 NULL !

    数据表中的 NULL 值表示该值所处的字段为空,值为 NULL 的字段没有值,尤其要明白的是:NULL 值与 0 或者空字符串是不同的。   ...以“不知道戴墨镜的人眼睛是什么颜色”这种情况为例,这个人的眼睛肯定是有颜色的,但是如果他不摘掉眼镜,别人就不知道他的眼睛是什么颜色。这就叫作未知。而“不知道冰箱的眼睛是什么颜色”则属于“不适用”。...特别需要记住的是,当 AND 运算中包含 unknown 时,结果肯定不会是 true (反之,如果AND 运算结果为 true ,则参与运算的双方必须都为 true )。....如果 AND 运算里包含 unknown,则结果不为true(参考三值逻辑的逻辑值表) SELECT * FROM t_student WHERE false 或 unknown;     可以看出,...也就是说,如果 NOT IN 子查询中用到的表里被选择的列中存在 NULL ,则 SQL 语句整体的查询结果永远是空。这是很可怕的现象!

    1.3K20

    sparksql源码系列 | 最全的logical plan优化规则整理(spark2.3)

    如果此CTE定义引用了另一个具有非确定性表达式的CTE定义,则仍然可以内联当前CTE定义。2.在整个主查询和所有子查询中,CTE定义只被引用一次。...此方法从子查询Filter中删除相关谓词,并将这些谓词的引用添加到所有中间Project和Aggregate子句(如果缺少的话),以便能够在顶层评估谓词。...:1.用true文本值替代;2.如果操作数都是非空的,用true文本值替代 =, =;3.如果操作数都是非空的,用false文本值替代>和如果有一边操作数是布尔文本值,就展开...这可以通过以下方式实现:1.在其计算结果始终为true的情况下,省略Filter。2.当筛选器的计算结果总是为false时,替换成一个伪空关系。3.消除子节点输出给定约束始终为true的条件。...这个规则处理下面的情况:1.如果子节点的最大行数小于或等于1;2.如果排序顺序为空或排序顺序没有任何引用;3.如果排序运算符是本地排序且子节点已排序;4.如果有另一个排序运算符被 0...n 个 Project

    2.6K10

    《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)

    如果没有任何WHEN表达式结果为TRUE,CASE表达式则返回ELSE子句中出现的值。...' END ) FROM Sales.OrderValues   (8)三值谓词逻辑:TRUE、FALSE与UNKNOWN   SQL支持使用NULL表示缺少的值,它使用的是三值谓词逻辑,代表计算结果可以使...这是因为对于所有的外部行,因为它们在o.orderdate列上的取值都为NULL,所以WHERE子句中条件o.orderdate='20070212'的计算结果为UNKNOWN,因此WHERE子句会过滤掉所有的外部行...(3)EXISTS谓词:它的输入是一个查询,如果子查询能够返回任何行,则返回True,否则返回False   例如下面的查询会返回下过订单的西班牙客户: select custid, companyname...如果不需要支持输入,则使用视图;反之,则使用内联表值函数。 四、集合运算 4.1 UNION 并集运算 ?   在T-SQL中。UNION集合运算可以将两个输入查询的结果组合成一个结果集。

    2K51

    为什么 GROUP BY 之后不能直接引用原表中的列

    注意 STRICT_TRANS_TABLES 不是几种策略的组合,单独指 INSERT、UPDATE 出现少值或无效值该如何处理:       1、前面提到的把 ‘’ 传给int,严格模式下非法,若启用非严格模式则变成...0,产生一个warning;       2、Out Of Range,变成插入最大边界值;       3、当要插入的新行中,不包含其定义中没有显式DEFAULT子句的非NULL列的值时,该列缺少值...我们继续往下看 阶   阶(order)是用来区分集合或谓词的阶数的概念。谓词逻辑中,根据输入值的阶数对谓词进行分类。...= 或者 BETWEEEN 等输入值为一行的谓词叫作"一阶谓词",而像 EXISTS 这样输入值为行的集合的谓词叫作"二阶谓词"(HAVING 的输入值也是集合,但它不是谓词)。...以此类推,三阶谓词=输入值为"集合的集合"的谓词,四阶谓词=输入值为"集合的集合的集合"的谓词,但是 SQL 里并不会出现三阶 以上的情况,所以不用太在意。

    1.7K10

    神奇的 SQL 之层级 → 为什么 GROUP BY 之后不能直接引用原表中的列

    注意 STRICT_TRANS_TABLES 不是几种策略的组合,单独指 INSERT、UPDATE 出现少值或无效值该如何处理:       1、前面提到的把 ‘’ 传给int,严格模式下非法,若启用非严格模式则变成...0,产生一个warning;       2、Out Of Range,变成插入最大边界值;       3、当要插入的新行中,不包含其定义中没有显式DEFAULT子句的非NULL列的值时,该列缺少值...我们继续往下看 阶   阶(order)是用来区分集合或谓词的阶数的概念。谓词逻辑中,根据输入值的阶数对谓词进行分类。...= 或者 BETWEEEN 等输入值为一行的谓词叫作"一阶谓词",而像 EXISTS 这样输入值为行的集合的谓词叫作"二阶谓词"(HAVING 的输入值也是集合,但它不是谓词)。...以此类推,三阶谓词=输入值为"集合的集合"的谓词,四阶谓词=输入值为"集合的集合的集合"的谓词,但是 SQL 里并不会出现三阶 以上的情况,所以不用太在意。简单点如下图 ?

    2.2K20

    算法工程师-SQL进阶:温柔的陷阱-NULL

    我们以往遇到的编程语言基本都是基于二值逻辑的,即逻辑真值只有true和false两个。...而 SQL 语言则采用一种特殊的逻辑体系——三值逻辑,逻辑真值除了true和false,还有第三个值unknow,即 “不确定”。...NULL 只是一个表示“没有值”的标记,而比较谓词只适用于值。因此,对并非值的 NULL 使用比较谓词本来就是没有意义的 。 因此,对 NULL 使用比较谓词后得到的结果总是 unknown。...而查询结果只会包含 WHERE 子句里的判断结果为 true 的行,不会包含判断结果为 false 和 unknown 的行。判断是否为NULL,应该用谓词:IS NULL。...简单总结一下: NULL 不是值,而是一种标记; 因为 NULL 不是值,所以不能对其使用谓词; 对NULL 使用谓词后的结果是 unknown; unknown 参与到逻辑运算时,SQL 的运行会和预想的不一样

    85620

    SQLServer数据库设置项梳理

    默认设置为 ON,其他版本,默认为 OFF AUTO_CREATE_STATISTICS ON:将自动创建谓词所使用的列的统计信息: OFF:需要手动创建统计信息 默认值为 ON AUTO UPDATE...或 STATIC 的游标除外 默认值为 OFF CURSOR DEFAULT 如果指定了LOCAL,并且创建游标时没有将其定义为GLOBAL,则游标的作用域将局限于创建游标时所在的批处理、存储过程或触发器...游标名仅在该作用域内有效 如果指定了GLOBAL,并且创建游标时没有将其定义为LOCAL,则游标的作 用域将是相应连接的全局范围。...ANSI_NULLS ON:所有与空值的比较运算计算结果为UNKNOWN。 OFF:非UNICODE 值与空值的比较运算在两者均为NULL时结果为TRUE。默认值为OFF。...YIELDS NULL ON :如果串联操作的两个操作数中任意一个为 NULL,则结果也为 NULL; OFF:空值将按空字符串对待 默认值为 OFF QUOTED IDENTIFIER ON:双引号可用来将分隔标识符括起来

    75910

    Hive优化器原理与源码解析系列--优化规则AggregateProjectPullUpConstantsRule(十七)

    但此Rule规则从不删除最后一列,简单来讲,如果groupBy字段只有一列,而且为常量,也不会执行此优化,因为聚合Aggregate([])返回1行,即使其输入为空。...它们是从输入关系表达式和关系运算符推断出来的。 例如,如果将Filter(x>1)应用于谓词y的关系表达式,则过滤器的上拉谓词为[y1]。...推断谓词:仅适用于联接。如果联接的左输入上有谓词,并且该谓词位于联接条件中使用的列上,则可以在联接的右输入上推断谓词。(反之亦然。)...如果没有从此RelNode提取的谓词为null,则优化无法继续。...遍历aggregate引用的所有字段列表(包括聚合方法内的字段),如果是聚合方法表达式,名称和位置不变,如果是常量则直接提取出常量值,如'F' 作为字段值放置到Project中。

    1.4K10

    解读 Optimizing Queries Using Materialized Views:A Practical, Scalable Solution

    一个表达式可由一个文本字符串和一个列引用列表表示,为比较两个表达式,首先比较字符串,若字符串相同,则遍历比较列引用,如果所有列引用匹配,则表达式匹配。...首先判断视图输出中是否包含完全相同的表达式,如果存在,则直接替换为视图列引用;如果不存在,则检查引用列是否能完全映射到视图的输出列。 3.1.5....视图额外基表改写 S针对SPJ查询引用表 ,而视图额外引用一张表 ,即 。...有向图的各顶点分别代表基表 ;当视图直接或间接指定 与 之间存在连接,且连接满足所有五个条件(等值连接、涉及所有列、列值非空、外键约束、唯一键约束)时,则表 与 之间存在边。...考虑查询的谓词为 ,如果 没有声明为非空的,则会判断拒绝该视图。但由于查询中已限定 ,因此 为空的行都会忽略,在该场景下判断视图必须声明 必须非空具有局限性。 3.3.

    15742

    Java 8 - Optional全解

    这个方法每次引用一个变量都会做一次 null 检查,如果引用链上的任何一个遍历的解变量 值为 null ,它就返回一个值为“Unknown”的字符串。...更糟糕的是,发生 null 时返回的默认值,即字符串“Unknown”在三个不同的地方重复出现——出现拼写写错误的概率不小!当然,你可能会说,我们可以用把它们抽取到一个常量中的方式避免这种问题。...Optional 对象,如果传入的任何一个参数值为空,它的返回值也为空。...如果 Optional 对象的值存在,并且它符合谓词的条件filter 方法就返回其值;否则它就返回一个空的 Optional 对象。...如果 Optional对象为空,它不做任何操作,反之,它就对 Optional 对象中包含的值施加谓词操作。

    51322

    【数据库】03——初级开发需要掌握哪些SQL语句

    6 空值 空值给包括算数运算、比较运算和集合运算在内的关系运算带来了特殊的问题。 比如,如果算术表达式的任一输入值为空,则该算术表达式(如+,-,*,/)结果为空。 对比较运算,这也是一个问题。...重复元素如果都是空,会被判为相同去重。这与谓词中的处理有区别,因为在谓词中null = null会返回unknown。...如果元组上所有属性上取值相等,那么他们会被当做相同的元组,即使某些值为空,这种方式还适用与集合的并、交、和差运算。...在聚集函数中,除count(*)外的所有函数都会忽略输入集合中的空值。...由于空值被忽略,聚集函数的输入值集合可能为空集,规定空集的count运算值为0,其它所有聚集运算会返回一个空值,在一些更加复杂的SQL结构中空值的影响会更加难以捉摸。

    3.5K31

    Hive优化器原理与源码解析系列--优化规则UnionPullUpConstantsRule(八)

    ,这样可以把即出现在谓词中等于某个常量constant的又出现在Project投影中的变量或列引用,是此列引用不在参与中间结果的一系列的计算,直接在投影Project使用常量作为此列引用的返回值。...在等价变换即输入结果和输出结果不变的前提下,达到优化的目的,这也是优化器的价值所在。 优化规则Rule关于常量上拉的优化思路大致如此。...b、有关保留在从关系表达式RelNode发出的行中的谓词的元数据。如果谓词为null,则不做任何优化 c、如果谓词表达式中没有常量谓词,则不做任何优化。...topChildExprs收集这些字段引用RexNode,做顶层Project使用,也是常量上拉到Project的关键。如果此字段在等值常量谓词引用过,则存放常量RexNode。...否则此字段在等值常量谓词没引用过,则存放该字段RexNode 如select a,b from t1 where a=1,topChildExprs收集的 [1,b],其中1常量,b为字段。

    55420

    SQL谓词的概述(一)

    SQL谓词的概述(一) 描述计算结果为真或假的逻辑条件。 使用谓词 谓词是一个条件表达式,其计算结果为布尔值(true或false)。...对于指定字段的至少一个数据值,For Some条件必须为True。 FOR SOME %ELEMENT - 带有%VALUE或%KEY谓词子句的列表元素比较条件。...即使NULL=NULL也不能作为谓词。因为IN谓词是一系列相等性测试,所以在IN值列表中指定NULL没有意义。因此,指定任何谓词条件都会消除该字段的任何为空的实例。...默认情况下,字符串数据类型字段是用SQLUPPER排序规则定义的,它不区分大小写。 如果在查询中指定排序规则类型,则必须在比较的两边指定它。...不能使用OR逻辑操作符将引用表字段的集合谓词与引用另一个表中的字段的谓词关联起来。

    1.2K20

    Hive优化器原理与源码解析系列--优化规则HiveJoinAddNotNullRule(十二)

    判断由RelOptCall调用的优化规则Rule是否与输入参数RelNode关系表达式匹配,即此优化规则Rule能否应用到一个RelNode关系表达式树上。...,并从行类型的字段列表获取盖RelDataType是否为可空,如果可不空,则跳过 RelDataType keyType = input.getRowType().getFieldList()....true,如果恒为true,类似笛卡尔积,则也不会做任何优化 return; } 获取JoinPredicateInfo关联谓词信息对象,如果出现语义异常,同样返回return结束,...如果为真,则不做任何优化。如果都不恒为真,并把新的谓词信息创建Filter并复制到原lChild和rChild对象上。 if (!...总结 通过对HiveJoinAddNotNullRule优化规则源码解读,可知道了Inner join不是支持null值连接的,优化器在生成执行计划时,默默地把引用的可能为null的谓词加上

    46510
    领券