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

SQL 优化对比:驱动表 vs Hash 关联

问题背景 1.1 问题描述 在 SQL 优化的过程中,经常会通过 指定驱动表 或 修改表的关联方式 来实现。下面将以案例的形式来介绍他们的不同之处以及使用场景需要满足的条件。...USE_NL(@"SEL USE_NL(@"SEL 注意:ASP表是驱动表,所以不显示关联。...LNESTED-LOOP JOIN关联,其中A表,CAS表数据量不大,NLJ关联 符合预期; t表是大表,且where过滤条件中,t.STORE_ID是有效的过滤条件,故考虑让 t 表走hash关联;...SQL 优化 2.1 方案一:指定小表(A表)为驱动表 2.1.1 指定驱动表 /*+leading(A) use_nl(A,CAS,ASP,t) */ SQL 执行时间超过 30s,人为中断。...t 是大表,走了 USE_NL 关联,故 SQL 执行超时; 且表 A 虽然是小表,但是无直接 WHERE 过滤条件,故不能通过索引快速匹配,不适合作为驱动表; 2.1.2 查看执行计划 =======

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

    使用Calcite解析Sql做维表关联(二)

    继上一篇中使用Calcite解析Sql做维表关联(一) 介绍了建表语句解析方式以及使用calcite解析解析流表join维表方法,这一篇将会介绍如何使用代码去实现将sql变为可执行的代码。...部分得到的流表先转换为流,然后根据维表配置的属性(维表来源、查询方式等)选择不同的维表关联策略,得到一个关联之后的流,最后将这个流注册为一张表;对于insert部分就比较简单,insert部分的select...的表直接更换为关联之后的流表,然后执行即可。...以异步查询mysql为例分析:需要根据维表定义的字段、join的关联条件解析生成一条sql语句,根据流入数据解析出sql的查询条件值,然后查询得到对应的维表值,将流入数据与查询得到的维表数据拼接起来输出到下游...维表的sql实现思路以及部分demo代码的参考,但是其远远达不到工程上的要求,在实际使用中需要要考虑更多的因素:复杂嵌套的sql、时间语义支持、自定义函数支持等。

    93320

    使用Calcite解析Sql做维表关联(一)

    维表关联是离线计算或者实时计算里面常见的一种处理逻辑,常常用于字段补齐、规则过滤等,一般情况下维表数据放在MySql等数据库里面,对于离线计算直接通过ETL方式加载到Hive表中,然后通过sql方式关联查询即可...透过维表服务系列里面讲到的维表关联都是使用编码方式完成,使用Map或者AsyncIO方式完成,但是这种硬编码方式开发效率很低,特别是在实时数仓里面,我们希望能够使用跟离线一样sql方式完成维表关联操作。...在Flink1.9中提供了使用sql化方式完成维表关联,只需要实现LookupableTableSource接口即可,可以实现同步或者异步关联。...根据sql解析顺序先 from 部分、然后where 部分、最后select,那么对于join 方式,相当于join生成了一张临时表,然后去select 这张临时表,因此可以确认 sql解析流程: 1....sql解析部分已经完成,既然使用sql化方式,因此也需要定义源表与维表,数据源一般是kafka, 定义源表需要:表名称、字段名称、字段类型、数据格式、topic;维表假设为mysql,需要定义:表名称、

    1.3K30

    SQL处理表结构的基本方法整理(创建表,关联表,复制表)

    FROM 旧表 如果是 SQL SERVER 2008 复制表结构,使用如下方法: 在表上面右击——编写表脚本为:——Create到——新查询编辑器窗口,你也可以保存为sql文件, 新查询编辑器窗口的话在最上面一条把...SQL SERVER 2008 insert into b(a, b, c) select d,e,f from b; 说明:复制表(只复制结构,源表名:a 新表名:b) SQL: select* into...b from a where 11 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) SQL: insert into b(a, b, c) select d,e,f from b; 其他说明...wheretable.title=a.title) b 说明:外连接查询(表名1:a 表名2:b) SQL: selecta.a, a.b, a.c, b.c, b.d, b.f froma LEFT...))>5 说明:两张关联表,删除主表中已经在副表中没有的信息 SQL: delete from info wherenot exists ( select* from infobz where info.infid

    1.6K30

    SQL处理表结构的基本方法整理(创建表,关联表,复制表)

    FROM 旧表 如果是 SQL SERVER 2008 复制表结构,使用如下方法: 在表上面右击——编写表脚本为:——Create到——新查询编辑器窗口,你也可以保存为sql文件, 新查询编辑器窗口的话在最上面一条把...SQL SERVER 2008 insert into b(a, b, c) select d,e,f from b; 说明:复制表(只复制结构,源表名:a 新表名:b) SQL: select* into...b from a where 11 说明:拷贝表(拷贝数据,源表名:a 目标表名:b) SQL: insert into b(a, b, c) select d,e,f from b; 其他说明...wheretable.title=a.title) b 说明:外连接查询(表名1:a 表名2:b) SQL: selecta.a, a.b, a.c, b.c, b.d, b.f froma LEFT...))>5 说明:两张关联表,删除主表中已经在副表中没有的信息 SQL: delete from info wherenot exists ( select* from infobz where info.infid

    2.4K40

    mysql 小表A驱动大表B在内关联时候,怎么写sql?那么左关联呢?右关联有怎么写?

    一:mysql 小表A驱动大表B在内关联时候,怎么写sql在MySQL中,可以使用INNER JOIN语句来内关联两个表。如果要将小表A驱动大表B进行内关联,可以将小表A放在前面,大表B放在后面。...和columnY是用于内关联的列。...二:mysql 小表A驱动大表B在右关联时候,怎么写sql?左关联怎么写?在MySQL中,通过RIGHT JOIN(右连接)可以将小表A驱动大表B的连接操作。...下面是示例SQL语句,演示如何使用右连接:SELECT *FROM tableB BRIGHT JOIN tableA A ON A.id = B.id;在上述例子中,tableA是小表A,tableB...三:mysql执行sql顺序 是从左到右还是从右到左?在MySQL中,SQL语句的执行顺序是从上到下,从左到右的顺序。具体来说,MySQL首先会解析FROM子句,然后根据JOIN条件连接相关的表。

    1.2K10

    SQL Tuning 基础概述06 - 表的关联方式

    nested loops join(嵌套循环) 驱动表返回几条结果集,被驱动表访问多少次,有驱动顺序,无须排序,无任何限制。 驱动表限制条件有索引,被驱动表连接条件有索引。...hints:use_hash() 实验验证: 1.不同表连接的表访问次数验证 2.不同表连接的驱动顺序区别 3.不同表连接的排序情况分析 4.不同表连接的限制场景对比 5.不同表连接和索引的关系...,网上也有一个普遍流行的观点,就是小表作为驱动表。...正确地描述应该是:对于nested loops join和hash join来说,小的结果集先访问,大的结果集后访问(即与表的大小没有关系,与具体sql返回的结果集大小有关);而对于merge sort...(虽然在两张表的连接条件都建立了索引,却只能消除一张表的排序操作) 注:本文为《收获,不止Oracle》表连接一章的总结笔记。

    74720

    用ChatGPT辅助优化SQL:小表关联大表的性能提升实践

    在数据分析工作中,小表关联大表是常见却容易引发性能问题的场景。经过ChatGPT的辅助优化,查询耗时从最初的287秒降至3.2秒,性能提升近90倍。...问题背景:缓慢的用户行为分析查询最近在分析用户行为数据时,我遇到了一个性能瓶颈:需要将用户属性表(小表,约1万行)与用户行为日志表(大表,约2亿行)进行关联查询。...ChatGPT辅助的问题分析我向ChatGPT描述了查询缓慢的情况,它提供了几个关键的分析方向:执行计划分析 - 使用EXPLAIN查看查询计划索引检查 - 评估连接字段和过滤条件的索引情况数据分布分析 - 检查关联键的数据分布特征通过执行计划发现...深度思考:ChatGPT在SQL优化中的价值与局限通过这次优化实践,我发现ChatGPT在SQL优化中的几个突出价值:多方案提供:能快速给出多种优化思路,有些是我未考虑到的语法参考:提供准确的不同数据库系统的优化语法解释能力...能详细解释每种优化方案的原理和适用场景但也存在局限:缺乏数据感知:不了解实际数据分布和特征环境差异:需要人工调整以适应不同的数据库版本和配置执行计划分析:仍需人工解读执行计划的关键瓶颈总结与最佳实践基于这次经验,我总结出小表关联大表的优化

    45310

    【表设计表之间关联】

    “表之间关联是用数据库外键(Foreign Key)还是通过程序去维护关联”,实际情况往往是 更多倾向于程序维护,而不是在数据库层面强制使用外键。详细解释一下原因和做法: 1....数据迁移和灰度发布:大厂经常需要做数据迁移、分库分表,如果表强绑定外键,迁移会很麻烦。 跨库/分库问题:很多业务表是分库分表的,数据库层面无法直接实现跨库外键约束。...程序层面维护关联 大厂一般采用 程序约束 或 应用逻辑约束 来维护表关联: 在 ORM 或 DAO 层进行检查:插入子表前,先检查父表是否存在对应记录。...实际开发规范示例 以阿里或腾讯的开发规范为例: 数据库表设计通常不强制添加外键约束,但表注释里会注明逻辑关联。 对重要业务表(比如财务账单、支付记录等),会有应用层保证一致性。...对跨库/跨表的引用,外键几乎不可能用,只能程序维护。 ✅ 总结: 互联网企业:表关联通常通过程序层面维护,数据库外键很少用,更多是靠应用逻辑和事务保证数据一致性。

    38110

    利用ChatGPT辅助优化SQL小表关联大表性能的实践与思考

    场景背景在数据仓库开发中,我们经常遇到需要将小型维度表与大型事实表进行关联查询的场景。最近我在开发用户画像分析系统时,需要将用户属性表(500万行)与订单事实表(20亿行)进行关联查询。...用户表包含用户基本属性,订单表包含用户交易记录。我正在使用Spark SQL,有什么优化建议?"...ChatGPT回复的核心建议:确保关联字段上有合适的索引或分区考虑使用广播连接(Broadcast Join)如果小表能够放入内存检查数据倾斜问题调整并行度和内存配置基于这些建议,我开始了具体的优化实践...数据分布分析首先分析两张表的数据分布特征:-- 检查用户表在关联键上的分布SELECT user_id_range, COUNT(*) FROM ( SELECT FLOOR(user_id/1000000...) as user_id_range FROM user_table) GROUP BY user_id_range;-- 检查订单表在关联键上的分布SELECT user_id_range,

    52410

    Mybatid关联表查询

    一、一对一关联  1.1、提出需求   根据班级id查询班级信息(带老师的信息) 1.2、创建表和数据   创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关系...  MyBatis中使用association标签来解决一对一的关联查询,association标签可用的属性如下: property:对象属性的名称 javaType:对象属性的类型 column:...所对应的外键字段名称 select:使用另一个查询封装的结果 二、一对多关联 2.1、提出需求   根据classId查询对应的班级信息,包括学生,老师 2.2、创建表和数据   在上面的一对一关联查询演示中...Student [id=3, name=student_C]]] 41 System.out.println(clazz); 42 } 43 }  2.6、MyBatis一对多关联查询总结...  MyBatis中使用collection标签来解决一对多的关联查询,ofType属性指定集合中元素的对象类型。

    4.1K70

    SQL关联查询

    (1)形式一 select 字段列表 from A表 inner join B表 on 关联条件 【where 其他筛选条件】 说明:如果不写关联条件,会出现一种现象:笛卡尔积 关联条件的个数 = n...select 字段列表 from A表 left join B表 on 关联条件 where 从表的关联字段 is null 右外连接(RIGHT OUTER JOIN) 第一种结果:B ?...select 字段列表 from A表 left join B表 on 关联条件 union select 字段列表 from A表 right join B表 on 关联条件 (3)A ∪ B - A...select 字段列表 from A表 left join B表 on 关联条件 where 从表的关联字段 is null union select 字段列表 from A表 right join B...表 on 关联条件 where 从表的关联字段 is null 自连接:当table1和table2本质上是同一张表,只是用取别名的方式虚拟成两张表以代表不同的意义

    1.4K20

    flink维表关联系列之Hbase维表关联:LRU策略

    维表关联系列目录: 一、维表服务与Flink异步IO 二、Mysql维表关联:全量加载 三、Hbase维表关联:LRU策略 四、Redis维表关联:实时查询 五、kafka维表关联:广播方式 六、自定义异步查询...在Flink中做维表关联时,如果维表的数据比较大,无法一次性全部加载到内存中,而在业务上也允许一定数据的延时,那么就可以使用LRU策略加载维表数据。...但是如果一条维表数据一直都被缓存命中,这条数据永远都不会被淘汰,这时维表的数据已经发生改变,那么将会在很长时间或者永远都无法更新这条改变,所以需要设置缓存超时时间TTL,当缓存时间超过ttl,会强制性使其失效重新从外部加载进来...接下来介绍两种比较常见的LRU使用: LinkedHashMap LinkedHashMap是双向链表+hash表的结构,普通的hash表访问是没有顺序的,通过加上元素之间的指向关系保证元素之间的顺序,...可配置淘汰策略 非常适用于Flink维表关联LRU策略,使用方式: cache = CacheBuilder.newBuilder() .maximumSize(1000

    1.8K21

    flink维表关联系列之kafka维表关联:广播方式

    维表关联系列目录: 一、维表服务与Flink异步IO 二、Mysql维表关联:全量加载 三、Hbase维表关联:LRU策略 四、Redis维表关联:实时查询 五、kafka维表关联:广播方式 六、自定义异步查询...广播状态用于维表关联 如果需求上存在要求低延时感知维表数据的更新,而又担心实时查询对外部存储维表数据的影响,那么就可以使用广播方式将维表数据广播出去,既能满足实时性、又能满足不对外部存储产生影响,仍然以用户行为规则匹配为例...broadcastStateDesc).put(value.actionType,value) } }) env.execute() 以上就是简易版使用广播状态来实现维表关联的实现...,由于将维表数据存储在广播状态中,但是广播状态是非key的,而rocksdb类型statebackend只能存储keyed状态类型,所以广播维表数据只能存储在内存中,因此在使用中需要注意维表的大小以免撑爆内存

    1.7K31
    领券