打造次世代分析型数据库(四):几十张表关联?小Case!

从模型车到真实路口:基于YOLOv5-Lite与SORT的轻量化车流量检测系统实战 本文详细阐述了如何将基于YOLOv5-Lite与SORT的轻量化车流量检测系统从毕业设计原型部署到真实路口。文章聚焦于解决在嵌入式平台(如树莓派)上实现实时、稳定检测的工程挑战,涵盖数据采集、模型微调、系统集成及动态信号灯策略,为智能交通灯系统提供了实用的轻量化解决方案。 阅读详情

1b77f4f564f1d08b5d09c59b54fd3ec5.gif

作者介绍

qiannzhang(张倩),腾讯云数据库专家工程师,具备多年数据库内核研发经验,在大数据分析领域深耕多年。加入腾讯后,主要负责CDW PG数据库SQL引擎相关特性的研发工作。

背景介绍

CDW PG是腾讯自主研发的新一代分布式数据库,采用无共享的MPP集群架构,具备业界领先的数据分析查询处理能力,适用于PB级海量数据的OLAP应用场景。

在OLAP场景中,多表连接查询是最主要的查询类型之一。CDW PG支持多种连接类型,包括left join、right join、inner join和full join等。对于left join和right join来说,表的连接顺序是固定的,所以可选择的路径相对较少。但对于inner join来说,表的连接顺序可以互换,不同的连接顺序可能产生巨大的性能差异。

那么,当连接查询中表的数量不断增加的时候,CDW PG的优化器是如何找到一个最优的连接顺序路径,从而生成一个高效的查询计划呢?

搜寻最优解

在数据库中,表的扫描路径有顺序扫描、索引扫描和位图扫描等几种扫描方法。如果表上建有多个索引,还可能产生多个不同的索引扫描。优化器面临的第一个问题是,如何在所有的可能中选择一个比较好的扫描路径。

对于涉及单表的查询,通常情况下我们只需要选择代价较小的那一个扫描路径即可。但在多表连接的情况下,除了确定每个表的扫描路径,还需要确定使用的连接算法和连接顺序。CDW PG中支持三种表连接算法,分别是Hashjoin、Mergejoin和Nestloop。

通常情况下,表的扫描路径、连接算法和连接顺序三者之间还存在互相影响。以三表连接A join B join C on a1=b1 and b1=c1为例,假设表C在列c1上建有索引,那么我们可能会得到下面几种计划(实际中远不止下述几种可能):

b728bb289e8fdc5d2c9739d80dcdf44a.png

b54daf1e3e26f0b67ced14c2f00a4f38.png

30520517d64c8237c9dc02d4258cd02e.png

1ddd17c04a651f269636d4a5b6be703f.png

显然,这是一个搜索所有路径寻求最优解的过程。在数据库优化器中,路径搜索算法通常有三种:自底向上、自顶向下和随机方法。根据连接表数量的不同,CDW PG的优化器中使用了自底向上的动态规划和随机的遗传算法两种方法。

动态规划搜寻全局最优解

在动态规划算法中,首先需要通过重复使用子问题的解,减少计算量、降低问题复杂度;还有就是能够通过子问题的最优解构造出最终问题的最优解,即问题的解需要具有最优子结构性质。

具体到当前的表连接问题上,优化器采用自底向上的方法,首先从单表开始,每个表支持的每一种扫描路径作为第一层子问题的解。然后,从每两表连接开始考虑,计算出每两表连接的代价,作为第二层子问题的解。

第一层子问题和第二层子问题如下图所示,当前仅简化展示支持单种扫描路径和单种join类型的情况:

b3dbf0221e15fe15ec08ae9213897f2a.png

a3935d1dcc1cfc1c84fe655ae3bf8fba.png

两表的连接结果可以认为是一个新表,此时利用第一层和第二层子问题的解,继续进行连接,得到第三层子问题的解,如下图所示:

4226bf54becc81fdef23e6c521bb0dc8.png

在实际的查询计划生成过程中,并不是所有的表之间都可以做连接,所以动态规划算法的路径搜索复杂度是基本可控的。例如三表连接A join B join C on a1=b1 and a2=c1,其中表B和表C之间没有连接关系,在第二层子问题中将只有AB、BA、AC、和CA四种可能的连接路径。

但是,如果表的数量过多,动态规划算法仍然存在搜索空间过大的问题,此时CDW PG优化器会采用遗传算法,获得一个局部最优解,从而达到一个性价比较优的结果。

遗传算法搜寻局部最优解

一般来说,遗传算法的实现包括以下几个步骤:

  1. 初始化种群:对基因编码,并通过随机的排列组合,生成多个染色体,构成一个新的种群,并计算适应度;

  2. 选择染色体:通过随机算法,选择出用于交叉和变异的染色体;

  3. 交叉和变异:对染色体进行交叉和变异操作,产生新的染色体加入到种群;

  4. 淘汰染色体:对新染色体进行适应度计算,淘汰种群中不良的染色体。

具体到当前的表连接问题上,优化器将参与连接的表作为基因、不同的连接路径作为染色体、连接路径的总代价作为适应度。在每次迭代中,通过对随机选取的染色体进行交叉操作,产生新的连接路径,并通过适应度计算,淘汰不良的染色体,经过N轮之后获取一个局部最优的连接路径。

在CDW PG中,用户可以通过设置GUC参数enable_geqo选择是否开启使用遗传算法,并可以通过设置GUC参数geqo_threshold,选择在连接表的数量大于等于该阈值时使用遗传算法。

例如,当设置enable_geqo=true并且geqo_threshold=12时,表示当连接表的数量不小于12时,优化器将使用遗传算法生成连接路径,否则将使用动态规划算法生成连接路径。

连接中的数据重分布

CDW PG采用的是MPP架构,其中的数据表支持两种类型的数据分布,Shard分布和Replication分布。Shard分布是指表中的数据按某一列或某几列的值,经过函数计算后选择不同的存储节点,其特点是分布键值相同的数据必然存储在同一个节点上,所有节点存储的数据总和为一份全量的表数据;Replication分布是指表在所有存储节点上都存储着一份全量的表数据。

在CDW PG中,不同分布类型的表在连接选择时,除了扫描路径、连接类型和连接顺序外,还需要根据分布键和连接键的匹配情况,选择对应的数据重分布路径,以保证连接结果正确性。

表Replication分布

当连接两侧的表中,有一侧表是Replication分布时,不管另一侧表的分布键和连接键是否匹配,当前不需要进行数据重分布就可以进行连接操作。

例如A join B on a1=b1,假设A表按a2列Shard分布,B表是Replication分布,此时允许直接进行连接操作,其连接结果是按A表的a2列Shard分布,可继续参与后续的连接路径计算。

连接条件匹配表Shard分布

当连接两侧的表均为Shard分布,并且分布键和连接键是匹配的情况下,由于Shard分布可以保证对应列值相同的数据存储在同一节点上,当前仍然不需要进行数据重分布操作,可直接进行连接。

例如A join B on a1=b1,假设A表按a1列Shard分布,B表按b1列Shard分布,此时允许直接进行连接操作,其连接结果是按A表a1列(等价于B表b1列)Shard分布,可继续参与后续的连接路径计算。

连接条件不匹配表Shard分布

当连接两侧的表均为Shard分布,但是分布键和连接键不匹配的情况下,需要视情况对其中一侧或两侧的表进行数据重分布,将连接键值相同的数据重分布到同一节点上,以保证连接结果的正确性。

例如A join B on a1=b1,假设A表按a2列Shard分布,B表按b1列Shard分布,此时需要将A表按a1列进行数据重分布后,再与B表连接,其连接结果按A表a1列(等价于B表b1列)Shard分布,如下图所示。

087f0b68b06f204851785c222186f132.png

同样的查询,假设A表按a2列Shard分布,B表按b2列Shard分布,则需要将A表按a1列、B表按b1列分别进行数据重分布后,再执行连接操作,其连接结果分布方式同上,如下图所示。

b0a44d943ec3f699eabb036f1828a5f1.png

在分布键和连接键不匹配的情况下,我们还可以选择将其中一侧的表进行Replication分布后,再执行连接操作,此时连接结果可能具有不同的分布方式。

例如,对上述Plan 2,还可以对表A进行Replication分布,再执行连接操作,其连接结果按B表b2列Shard分布;或者对表B进行Replication分布,再执行连接操作,其连接结果按A表a2列Shard分布,两种计划分别如下图所示。

d6a20a9b210046513126daa84cf76d81.png

4466385d8d3db437004de8b0c7fdd9bd.png

优化器具体选择哪种数据重分布路径,同样是在上述搜寻最优解的算法框架内,按照代价进行选择,此时连接结果的分布方式也有一定影响。

数据分布选择的一些建议

显然,在MPP架构中,数据表分布方式的不同,将直接影响连接查询的性能。通常情况下,我们建议将类似维度表的数据表建成Replication分布,事实表按常用的连接键进行Shard分布,能够不同程度地提升连接查询性能。

数据分析案例-电脑笔记本价格数据可视化分析3 本文基于Kaggle笔记本数据集(1303条记录,13个变量),使用Python进行数据可视化分析。通过自定义函数预处理了CPU频率、内存类型等关键特征,利用Seaborn和Matplotlib绘制了品牌分布、内存类型占比、价格影响因素等可视化图表。研究发现:1)Dell和Lenovo市场份额最大;2)SSD是主流存储类型;3)高RAM配置普遍采用SSD;4)Intel处理器占据绝对优势。分析揭示了不同品牌、配置与价格的关系,为消费者购买决策和市场策略制定提供了数据支持。 阅读详情

相关推荐

高分系列卫星轨道、传感器参数等信息

遥感卫星数据简介-高分系列

中遥科 3309

集成服务入门(实验2)使用复制数据库向导

  SQL Server提供了复制数据库向导(CDW:Copy Database Wizard),可以将数据库从SQL Server 2000(或更高版本)的实例移动(或复制)到SQL Server 2005(或更高版本)的实例。 一、启动向导  在数据库的“任务”菜单中,选择“复制数据库”。  显示欢迎界面。二、选择源服务器和目标服务器 三、复制方法一:使用分离和附加方法  最快速的方法,是将源...

weixin_34336292的博客 420

别再花屏了!手把手教你用STM32CubeIDE搞定LVGL 8.3移植(附完整源码)

本文详细介绍了如何在STM32CubeIDE环境下成功移植LVGL 8.3,解决常见的花屏问题。从环境配置、显示驱动优化到编译警告处理,提供完整的实战方案和源码示例,帮助开发者快速实现流畅的嵌入式GUI界面。特别针对STM32平台的DMA2D加速和内存管理进行了深度优化。

weixin_33739646的博客 243

深入React Flow Renderer(一):构建可拖动低代码工作流(附代码地址)

在现代的Web开发中,构建可视化工作流和图形界面是一项常见的任务。传统上,这需要大量的前端工作,但现在有了一种强大的工具,可以使这个过程更加容易和高效——React Flow Renderer。本系列博客将深入介绍React Flow Renderer,这是一个用于构建可拖动低代码工作流的强大库。

m0_73117087的博客 1万+

Doris StreamLoad任务报错Connection reset

背景 Spark程序扫一张Hive表(大小3-7G),然后用http协议的streamLoad任务提交给Doris集群,在Doris集群从0.13.15升级到0.14.12后spark程序报错streamLoad时突然会Connection reset 分析 enable_http_server_v2 这个参数可以参考FE中文配置中查看到,作用是对于Doris界面是否开启新风格的界面,但是实际上他的作用远不止如此,请接着看 新老版本对于enable_http_server_v2参数默认值是不同的 在0.13

gaofeng的博客 3308

保姆级教程:用QSTEM和DrProbe搞定你的第一张STEM模拟图(附Fe3O4实例文件)

本文提供了一份详细的STEM模拟图像生成教程,涵盖从晶体结构获取到最终图像模拟的全过程。通过QSTEM和DrProbe软件的操作指南,帮助材料科学研究者快速掌握STEM模拟技术,特别适合初学者。教程包含Fe3O4实例文件,详细解析参数设置、计算优化和结果分析等关键步骤。

weixin_33730836的博客 523

ReactFlow与Apollo集成:实现GraphQL查询

1.背景介绍 1. 背景介绍 ReactFlow是一个用于构建流程图、流程图和有向图的React库。它提供了简单易用的API,使得开发者可以轻松地创建和管理复杂的有向图。Apollo是一个用于构建GraphQL客户端的库,它提供了简单易用的API,使得开发者可以轻松地查询和更新数据。 在本文中,我们将讨论如何将ReactFlow与Apollo集成,以实现GraphQL查询。这将有助于开发者更...

AI天才研究院 1216

GitLab中国区注册终极解决方案:绕过+86手机验证的实战技巧(2023最新)

本文详细解析了GitLab中国区注册时绕过+86手机验证的三种实战技巧,包括开发者工具调试方案、使用国际号码的变通方案以及本地化部署替代方案。通过技术分析和实践验证,帮助开发者顺利注册GitLab账号,提升团队协作效率。

rl6adventurer的博客 1498

自定义节点与连接:扩展ReactFlow的功能

1.背景介绍 1. 背景介绍 ReactFlow是一个基于React的流程图库,它可以用于构建和管理复杂的流程图。ReactFlow提供了一系列内置的节点和连接组件,但在某些情况下,我们可能需要扩展ReactFlow的功能,以满足特定的需求。例如,我们可能需要创建自定义节点类型,或者需要更改连接的样式和行为。 在本文中,我们将讨论如何扩展ReactFlow的功能,以实现自定义节点和连接。我们...

AI天才研究院 1069

HttpClient vs OkHttpClient:哪个更适合你的Java项目?(附性能对比实测)

本文深度对比了Apache HttpClient与OkHttpClient在Java项目中的性能表现与适用场景。通过实际性能测试,OkHttp在连接复用、高并发吞吐量及内存占用方面表现更优,尤其适合现代微服务与Spring生态。HttpClient则凭借其高度可配置性,在需要精细控制HTTP协议细节的场景中更具优势。文章提供了清晰的选型指南,帮助开发者根据项目需求做出最佳决策。

onion的博客 509

使用lightGBM进行数据建模及预测

在机器学习领域中,数据建模和预测一直是非常重要的任务。而lightGBM作为一种基于梯度提升算法的高效机器学习框架,被广泛应用于数据建模和预测中。本文将介绍如何使用lightGBM进行数据建模和预测。到此,我们已经成功使用lightGBM对数据进行了建模和预测。使用lightGBM可以快速、高效地完成数据建模和预测任务,是机器学习领域中不可或缺的工具之一。使用lightGBM进行数据建模及预测。

qq_37934722的博客 1016

react-flow实现dag工作流

react-flow 工作流

笃行999 2276

4、海洋哺乳动物运动能量学:潜水与生存的奥秘

本文深入探讨了海洋哺乳动物在潜水与运动中的能量消耗机制,涵盖其生理反应、代谢成本、节能行为策略及测量方法。通过分析不同物种的能量利用特点,揭示了它们如何在极端水下环境中维持能量平衡,并讨论了该研究在保护生物学、生态系统动态和动物健康管理中的实际意义。文章还展望了未来多学科交叉、长期监测及应对环境变化的研究方向,为理解海洋哺乳动物的生存奥秘提供了系统性视角。

p5l2m9n4o6q的博客 116

Mysql与GoldenDB各自的sql脚本语句写法(创建、删除数据表,向数据表中插入数据),以及相互的转换使用。

Mysql与GoldenDB各自的sql脚本语句写法,以及相互的转换使用。

记录和分享属于我的“IT”时光。 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

宽表 VS 多表关联,谁才是大数据分析的最佳选择?

举个简单的例子,比如当时客户表里没有客户区域这个字段,后来增加了这个字段,亦或者,原来客户区域这个字段有些客户没有填写,现在重新填写了,那么,仍然需要重新跑一遍历史数据。2、奥威BI数据可视化平台支持多事实表,也就是说,在同一个数据集市(分析模型)中,可以包含多个事实表,既可以包含销售订单,还可以包含销售出库单,这样,就可以很方便的实现分别从订单及出库单取数来计算订单出库率,而如果用宽表,这种场景还需要另外构建一个大表,将订单与出库表的所有字段都包含进来,又会造成开发与运维成本的大幅增加。

qq_43696218的博客 1373

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

MapReduce原理

MapReduce原理 文章目录MapReduce原理MapReduce架构MapReduce执行过程MapReduce的map与reduce过程`MapReduce`流程总览:`MapReduce`详细流程:`Map`端分析:`Shuffle`过程分析:`map`端的`shuffle`:`Reduce`端的`shuffle`:`Reduce`端分析: MapReduce架构 在MapReduce...

Au的博客 1468

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

PostgreSQL 配置文件详解

如果要查看配置文件中的一些选项,则可以登录psql后 使用 命令来查看; show 选项名; show all; #查看所有数据库参数的值 主要选项: 选项 默认值 说明 是否优化 原因 max_connections 100 允许客户端的最大并发连接数目 否 因为在测试的过程中,100个连接已经足够 fsync on 强制把数据同步更新到磁盘 是 因为系统的IO压力很大,为了更好的测试其他配置的影响,把改参数改为off s...

技术小站 2541

SQL基本语句

<br />转自:http://tech.it168.com/KnowledgeBase/Articles/7/5/0/7507b50e9ee93f3528b338d11f816d89.htm<br /> <br /><br />create table [表名] <br />( <br />[自动编号字段] int IDENTITY (1,1) PRIMARY KEY , <br />[字段1] nVarChar(50) default '默认值' null , <br />[字段2] ntext n

cdw123125的专栏 332

openGauss 查询规划 :基因查询优化器

这个算法减少了对复杂查询规划的时间,而且生成规划的开销有时也小于正常的详尽的查询算法。设置为0,表示使用系统自适应方式,openGauss会基于geqo_effort和表的个数选取合适的值。:控制GEQO使用的随机数生产器的初始化值,用来从顺序连接在一起的查询空间中查找随机路径。:如果执行语句的数量超过设计的FROM的项数,则会使用基因查询优化来执行查询。比默认值大的数值增加了查询规划的时间,但是也增加了选中有效查询的几率。不同的值会改变搜索的连接路径,从而影响了所找路径的优劣。

weixin_53596073的博客 718

linux常用命令分类总结!

文章目录一、文件和目录1. cd2. pwd3. ls4. cp5. mv6. rm二、查看文件内容1. cat三、文件搜索1. find四、文件的权限1. chmod2. chown3. chgrp五、文本处理1. grep2. paste3. sort4. comm六、打包和压缩文件七、系统和关机(关机、重启和登出)八、进程相关的命令1. ps2. kill3. killall4. top 一、文件和目录 1. cd 用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。

Nick Blog 2496

一个接口查询关联了十几张表,响应速度太慢?那就提前把它们整到一起

不知道开发的同学有没有遇到过类似这样的需求: 相同类型的数据在多个系统中,如果要得到全部的信息,就要连续调多个系统的接口; 业务复杂,一个需求需要关联几张表甚至几十张表才能得到想要的结果; 系统做了分库分表,但是需要统计所有的数据。 那么此类需求要如何满足呢?我们选择了“通过 ETL 提前进行数据整合”的方案。 什么是 ETL 说到ETL,很多开发伙伴可能会有些陌生,更多的时候 ETL 是用在大数据、数据分析的相关岗位;我也是在近几年的工作过程中才接触到ETL的,现在的项目比较依赖 ETL,可以说是项目

会点代码的大叔 1810

PostgreSQL服务器管理:服务器配置

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权。 1. 设置参数 1.1. 参数名称和值 所有参数名都是大小写不敏感的。每个参数都可以接受五种类型之一的值: 布尔、字符串、整数、 浮点数或枚举。该类型决定了设置该参数的语法: 布尔: 值可以被写成 on, off, true, false, yes, no, 1, 0 (都是...

weixin_33716941的博客 967

postgresql.conf geqo_threshold

baidu_24377669的博客 216

pgsql数据库默认配置事务类型_Postgresql常用配置参数详解

Postgresql常用配置参数详解:show all; #查看所有数据库参数的值https://www.cndba.cn/xty/article/3529选项默认值说明是否优化原因max_connections100允许客户端的最大并发连接数目是生产环境需与研发确认fsyncon强制把数据同步更新到磁盘是因为系统的IO压力很大,为了更好的测试其他配置的影响,把改参数改为offshared_bu...

weixin_39674293的博客 495

数据库多表关联

多表关联查询,两个表之间连接关系可分为左外连接left [outer] join,右连接right [outer] join,全外连接full [outer] join,内连接[inner] join。 举例说明下 table student SID NAME DNO 1 zs 1 2 ls 1 3 bs 2 table dept DID DNAME 1 研发部 2 测试部 3 ...

weixin_56494755的博客 1620
上一篇: 上新啦!腾讯云云原生数据湖产品DLC 2.2.5版本发布,来看特性详解!
下一篇: 十年磨一剑 | 《腾讯大数据构建之道》正式出版
腾讯云大数据
博客等级 码龄6年 348粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值