• [技术干货] 说说你对Mybatis的了解
    1.Mybatis 基于java的持久层框架,它的内部封装了JDBC,让开发人员只需要关注SQL语句本身,不需要花费精力在驱动的加载、连接的创建、Statement的创建等复杂的过程。2.Mybatis 通过 XML 或注解的方式将要执行的各种的 statement 配置起来,并通过 java 对象和 statement 中的 sql 的动态参数进行映射生成最终执行的SQL 语句,最后 由mybatis框架执行SQL,并将结果直接映射为java对象 。3.采用了 ORM思想 解决了实体类和数据库表映射的问题。对 JDBC进行了封装 ,屏蔽了 JDBCAPI 底层的访问细节,避免我们与 jdbc 的 api 打交道,就能完成对数据的持久化操作。
  • [技术干货] 防止sql注入
    sql注入是Web开发中最常见的一种安全漏洞,会导致利用数据库特性执行添加用户、导出文件等操作等
  • [技术干货] MySQL 的性能优化
    1.索引优化    2.添加查询缓存    3.优化数据库SQL语句    4.数据库Cluster    1>首先,开启慢查询global【配置文件】,(标准可以自定义),通过分析日志文件或直接show,查看哪些查询较慢.    2>针对这条sql,添加Explain,查看其执行计划,查询数据条数/索引等        优化:        1.创建index索引,会占用存储空间,而且会降低DML操作的效率(做增删改需要维护索引),一般在sql中的where或者order by字段建立索引        2.通过查询缓存,可以开启Mybatis的二级缓存,自定义实现Mybatis+redis/Ehcache结合,需要注意的是,只对结果缓存,缓存结果要放在以业务逻辑相关为划分单位。缓存原则是对那些查询需求远大于增删改需求的数据        除此之外,尽量不要在where子句中使用函数,会使索引失效        如果已经确定查询结果只有一条数据(当表中数据的该字段是唯一的),在查询SQL末尾增加 limit 1        模糊查询尽量使用右模糊,左模糊会使索引失效        如果非要使用表连接,最好要保证连接的两个字段都是创建了索引的        避免使用select *        尽量使用非空  not null,可以使用‘’空串代替null。因为‘’不占用空间,null会占用空间的        在SQL语句中不要有运算,否则MySQL会放弃索引。        对于百万级以上的表数据,如果要做表连接查询,一定要对表先分页,然后对分页结果再做表连接。也可以不用表连接        nginx(负载均衡)  读写分离(MyCat) 主从复制(修改配置文件)
  • [热门活动] 暑期漫漫想躺平,不如来华为云沙箱训战营!
    八月炎炎,结束繁重考试,假日是属于“躺平”的,而我却在华为云数据库社区的后台收到了这样一条留言:不得不说这个同学还是挺有眼光的,数据库与操作系统一样,都属于基础软件产品,是“国之重器”,是可以干一辈子的工作,而且越老越吃香,35岁职场定律在这个一行根本不存在。对于很少接触数据库的人来说,可能不甚了解,那什么是数据库呢?举个生活化一点的例子,我们家里都会有冰箱,冰箱是用来干什么的?冰箱是用来存放食物的地方。数据库就是这个角色,简而言之就是存放数据的地方。正是因为有了数据库,我们才可以直接查找数据。银行每天有百亿级别的账户交易,你查看自己消费账单,都是数据库读取数据后给你的。大数据时代,企业每天常常会面临上亿条数据的分析与处理,学会如何使用SQL来分析数据对于开发工程师、数据分析师至关重要。数据库可分为关系型数据库和非关系数据库,今天着重介绍一下关系型数据库中的MySQL数据库。俗话说,万丈高楼平地起。学习数据库,首先得学习MySQL就需要掌握和理解基础知识点,按顺序一步一步来,扎实的基础知识也能给实践带来良好的体验。另外,最重要的是实操。纸上得来终觉浅,实践过程中都会面临有思路但就是写不出来或者写出来执行不下去的感觉,这种挫败感常常是大部分人放弃的原因之一。其实,如果一段路上有强者同行,我们就能走得更远、更久。有同学不禁感慨,达到以上要求,须得天时地利人和呀!就在现在,机会来啦!华为云学院联合华为云数据库为初级开发者量身定做训战营活动——沙箱实验训战营第7期:7天玩转RDS for MySQL数据库。数据库沙箱实验训战营活动,围绕“沙箱实验”展开,推出“学、练、考”一站式体验,通过精品实战课程,华为云数据库专家讲师直播在线陪练,每日社群在线学习,实时互动交流,考取专业证书,让你7天玩转RDS for MySQL数据库!别忘了,我们还有荣耀手环、蓝牙音箱、开发者IP——鼠标垫&PVC包等好礼等你来挑战哦!戳此报名参加:https://edu.huaweicloud.com/activity/lab_camp07.html
  • [技术干货] MyBatis - 动态 sql
    动态sql  MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。动态 SQL 可以彻底处理条件地串联 SQL 字符串减少程序员的压力,让程序员将更多地精力投入开发业务中。  MyBatis 中用于实现动态 SQL 的元素主要有:If 标签可以对传入的条件进行判断#{}占位符,预编译,先编译好sql语句在取值,防止sql注入(传值时使用) ${}拼接符,会传入参数字符中,取值后再编译sql,不能防止注入 ${}适用于select * from user order by ${name} insert into user values (3,'jim',22) useGeneratedKeys="true"返回主键 keyProperty="id" 用bean下的属性接收 keyColumn="id" 数据库中的列where 标签  会进行判断,如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉AND 或 OR。<select id="findUser" resultType="User"> select * from user <!-- <if test="">条件判断 <where>当条件成立时,插入where关键字,否则不插入 会取出where 语句中开头的and or 等关键字 --> <where> <if test="address!=null"> and address = #{address} </if> <if test="user_name!=null"> and user_name = #{user_name} </if> </where> </select>trim 标签  其实用 trim 也可以表示,当 WHERE 后紧随 AND 或则 OR 的时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定内容  使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分<select id="findUser" resultType="User"> select * from user <trim prefix="where" prefixOverrides="and | or"> <if test="address!=null"> and address = #{address} </if> <if test="user_name!=null"> and user_name = #{user_name} </if> </trim> </select>模糊查询<!-- 模糊查询 1.在mapper中 user_name like '%${user_name}%' 2.在传值时候拼接好 map.put("user_name","%j%"); 3.使用concat('%',#{user_name},'%') --> <select id="findUser1" resultType="User"> select * from user <where> <if test="user_name!=null"> and user_name like concat('%',#{user_name},'%') </if> </where> </select>set 元素可以把最后一个逗号去掉<update id="update" parameterType="User"> update user <set> <if test="userName!=null"> user_name = #{userName}, </if> <if test="age!=null"> age = #{age}, </if> <if test="mobile!=null"> mobile = #{mobile}, </if> <if test="address!=null"> address = #{address} </if> </set> where id = #{id} </update>也可以使用trim实现<update id="update" parameterType="User"> update user <trim prefix="set" suffixOverrides=","> <if test="userName!=null"> user_name = #{userName}, </if> <if test="age!=null"> age = #{age}, </if> <if test="mobile!=null"> mobile = #{mobile}, </if> <if test="address!=null"> address = #{address} </if> </trim> where id = #{id} </update>Foreach元素  主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。  在使用 foreach 的时候最关键的也是最容易出错的就是 collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的。  – 如果传入的是单参数且参数类型是一个 List 的时候,collection 属性值为 list  – 如果传入的是单参数且参数类型是一个 array 数组的时候,collection 的属性值为array适用范围,删除多个数据  item 表示集合中每一个元素进行迭代时的别名  index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置  open 表示该语句以什么开始  separator 表示在每次进行迭代之间以什么符号作为分隔符  close 表示以什么结束<delete id="deleteUser" parameterType="User"> delete from user where id IN <foreach collection="array" item="id" open="(" close=")" separator=","> #{id} </foreach> </delete>特殊符号处理  在 mybatis 中的 xml 文件中,存在一些特殊的符号,比如:<、>、"、&、<>等,正常书写 mybatis 会报错,需要对这些符号进行转义。具体转义如下所示:  特殊字符 转义字符< &lt; > &gt; " &quot; ’ &apos; & &amp;  也可以使用<![CADTA[]]>来包裹特殊字符,但是这种方式所在的内容会被解析器忽略,应减少使用<if test="id != null"> AND <![CDATA[ id <> #{id} ]]> </if>     以上。————————————————
  • [技术干货] 存储过程
    存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。
  • [技术干货] MyBatis - 动态 sql
    动态sql  MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力。动态 SQL 可以彻底处理条件地串联 SQL 字符串减少程序员的压力,让程序员将更多地精力投入开发业务中。  MyBatis 中用于实现动态 SQL 的元素主要有:If 标签可以对传入的条件进行判断#{}占位符,预编译,先编译好sql语句在取值,防止sql注入(传值时使用) ${}拼接符,会传入参数字符中,取值后再编译sql,不能防止注入 ${}适用于select * from user order by ${name} insert into user values (3,'jim',22) useGeneratedKeys="true"返回主键 keyProperty="id" 用bean下的属性接收 keyColumn="id" 数据库中的列where 标签  会进行判断,如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以 AND 或 OR 开头,它会剔除掉AND 或 OR。<select id="findUser" resultType="User"> select * from user <!-- <if test="">条件判断 <where>当条件成立时,插入where关键字,否则不插入 会取出where 语句中开头的and or 等关键字 --> <where> <if test="address!=null"> and address = #{address} </if> <if test="user_name!=null"> and user_name = #{user_name} </if> </where> </select>trim 标签  其实用 trim 也可以表示,当 WHERE 后紧随 AND 或则 OR 的时候,就去除 AND 或者 OR。prefix 前缀,prefixOverrides 覆盖首部指定内容  使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分<select id="findUser" resultType="User"> select * from user <trim prefix="where" prefixOverrides="and | or"> <if test="address!=null"> and address = #{address} </if> <if test="user_name!=null"> and user_name = #{user_name} </if> </trim> </select>模糊查询<!-- 模糊查询 1.在mapper中 user_name like '%${user_name}%' 2.在传值时候拼接好 map.put("user_name","%j%"); 3.使用concat('%',#{user_name},'%') --> <select id="findUser1" resultType="User"> select * from user <where> <if test="user_name!=null"> and user_name like concat('%',#{user_name},'%') </if> </where> </select>set 元素可以把最后一个逗号去掉<update id="update" parameterType="User"> update user <set> <if test="userName!=null"> user_name = #{userName}, </if> <if test="age!=null"> age = #{age}, </if> <if test="mobile!=null"> mobile = #{mobile}, </if> <if test="address!=null"> address = #{address} </if> </set> where id = #{id} </update>也可以使用trim实现<update id="update" parameterType="User"> update user <trim prefix="set" suffixOverrides=","> <if test="userName!=null"> user_name = #{userName}, </if> <if test="age!=null"> age = #{age}, </if> <if test="mobile!=null"> mobile = #{mobile}, </if> <if test="address!=null"> address = #{address} </if> </trim> where id = #{id} </update>Foreach元素  主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。  在使用 foreach 的时候最关键的也是最容易出错的就是 collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的。  – 如果传入的是单参数且参数类型是一个 List 的时候,collection 属性值为 list  – 如果传入的是单参数且参数类型是一个 array 数组的时候,collection 的属性值为array适用范围,删除多个数据  item 表示集合中每一个元素进行迭代时的别名  index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置  open 表示该语句以什么开始  separator 表示在每次进行迭代之间以什么符号作为分隔符  close 表示以什么结束<delete id="deleteUser" parameterType="User"> delete from user where id IN <foreach collection="array" item="id" open="(" close=")" separator=","> #{id} </foreach> </delete>特殊符号处理  在 mybatis 中的 xml 文件中,存在一些特殊的符号,比如:<、>、"、&、<>等,正常书写 mybatis 会报错,需要对这些符号进行转义。具体转义如下所示:  特殊字符 转义字符< &lt; > &gt; " &quot; ’ &apos; & &amp;  也可以使用<![CADTA[]]>来包裹特殊字符,但是这种方式所在的内容会被解析器忽略,应减少使用<if test="id != null"> AND <![CDATA[ id <> #{id} ]]> </if>   
  • [7天实战营] 【大数据Day4】借助 DLI Flink SQL 进行电商实时业务数据分析实操分享
    > 前言: 这期大数据有点儿小意思,从课程预热的资源获取(还能抽奖)到目前接触到两期的实战讲解,都是能产出商业价值视频实战课,而不再是只是根据指导,一步一步的验证理论的课程了,而且还留有一定拓展空间。话不多说,咱们进入这次电商实时数据分析案例的实操分享~场景描述 当前线上购物无疑是最火热的购物方式,而电商平台则又可以以多种方式接入例如 通过web方式访问、通过app的方式访问、通过微信小程序的方式访问等 -- 分析: 属于异构平台而电商平台则需要每天统计各平台的实时访问数据量、订单数、访问人数等等指标,从而能在显示大屏上实时展示相关数据,方便及时了解数据变化,有针对性地调整营销策略。而如何高效快捷地统计这些指标呢?        假设平台已经将每个商品的订单信息实时写入Kafka中,这些信息包括订单ID、订单生成的渠道(即web方式、app方式等)、订单时间、订单金额、折扣后实际支付 金额、支付时间、用户ID、用户姓名、订单地区ID等信息。而我们需要做的,就是根据当前可以获取到的业务数据,实时统计每种渠道的相关指标,输出存储到 数据库中,并进行大屏展示。我们不难发现,需要用到的技术点如下:DMS Kafka  -- 用于生产数据RDS MySQL -- 用于模拟存储DLI CCE -- 用于跨源数据处理DLV大屏 -- 用于可视化展示给用户创建的过程就不详细写了,请大家可以看附件,老师们总结得很详细~我这边发现的几个问题点:几个服务要创建在同一个区域,同一个VPC里,网络网段需要在一起注意创建跨源链接时,勾选 专属可以不用创建虚拟机去安装Kafka的客户端,用自己的PC就可以  ,有答复就可以   可视化服务可以访问其页面进行试用  直达-->  数据可视化_数据可视化平台_数据可视化制作_数据大屏制作-华为云 (huaweicloud.com)在数据库的脚本里,记得修改为自己的mysql实例,以及Kafka实例有趣的点儿Flink UIKafka Manager不得不说华为云的性能监控常见问题解答:1.运行日志加载不出来,同时在OBS桶不允许下载?答:配置作业时勾选保存日志到obs2.创建的队列怎么找?答: 1.确认已联系包子老师开通CCE专属队列白名单;2.创建队列的时候勾选一下专属,按需。3.怎么知道买的队列是CCE队列呢?答:cce队列是我们在内测的容器化队列,你把项目id发群内包子老师,给你加了权限再建出来的就是,前台没有显式标明。4.java kafaka client的安装包怎么下?答:本地有linux环境的话,直接下载一个kafka的tar包,www.kafkatool.com,命令行就可以。5.是否需要买云服务器ECS?答:不需要,在dms实例上挂个eip开启公网访问,这样本地就可以发数据到云上kafka。6.创建对等连接要很长时间么?答:不需要,不过如果你的队列还在绑定集群的话可能时间就会比较长,大概10分钟。7.两个都在一个VPC,不需要创建对等连接的嘛?答:我们理一下。首先你在你的账户下创建了vpc1,然后在vpc1里面创建了dms和rds,再然后你创建了dli队列,因为dli队列是逻辑资源,实际资源在dli的账户的vpc2下面。这两个vpc网络是不同的,也是不通的,所以需要打通网络。创建跨源链接实际就是打通网络的过程,选择的vpc是vpc1,安全组也是。8.Kafka groupID是指Kafka 的实例ID 么?答:group是消费组,每个组都是独立消费的,建议这块可以找个kafka博客看一下,这里你任意指定就可以,比如test-group9.怎么看是否授权成功?答:是dli这边的授权么,那个勾打上了就OK10.运行失败怎么查看日志、分析原因呢?答:看运行日志,配置作业时勾选保存日志到obs祝愿大家都能组合成自己的大屏~~
  • [问题求助] 如何将数据库放到华为云服务器上,我用的是sql sever
    【功能模块】【操作步骤&问题现象】1、2、【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] 异构数据库怎么迁?华为云UGO携 5大核心特性来解答
    数据库源库画像定位:全面采集源库数据信息(如TPS、QPS、表复杂度等),精准定位源库信息全貌,为分析源库应用场景、用户操作习惯等重要信息提供足够的数据基础。目标库兼容性分析:作为华为云UGO迁移能力的核心模块之一,该模块基于源库画像定位和高达85%的综合语法转换率,对目标库14个核心对象类型进行兼容性分析和迁移风险评估,哪些可以支持,哪些不支持,结果一目了然,对于不支持的对象,华为云UGO还提供了改造建议。迁移工作量评估:对人力、海量场景输入、兼容性改造难度等迁移成本进行精准评估,综合输出迁移工作量,让客户对整体迁移工作有一个量化感知。目标库选型与规格推荐:依据源库画像输入,综合兼容性、性能、对象复杂度、使用场景等,智能推荐合适的目标库选型和优先级,以及不同选型下的规格和成本,让客户选型安心。数据库结构迁移:结构迁移是华为云UGO迁移能力最核心的模块,该模块会将源库的各类SQL直接转换为目标端的SQL语法,支持过滤掉无效对象/不需要迁移的对象,转换完成后标记转换失败对象和失败原因,用户可根据失败原因进行对象校正,校正之后进行验证测试,验证失败对象可重新修改后多次提交验证,直至所有对象验证全部成功后,整个迁移实施流程才结束,而且整个迁移过程可视化、自动化,真正做到了省心省力。应用实践方面,华为云UGO广泛适用于金融、互联网、政府等领域迁移改造场景,并在华为公司流程IT项目中获得优秀实践。华为公司流程IT拥有数十万张表,存储过程代码超过亿级,迁移数据量高达数TB。华为云UGO通过迁移评估和SQL转换,助力华为公司流程IT迁移周期从以天为单位缩短为小时级,减少了50%存储过程改造成本,节省了70%+工作量,高效支撑华为公司流程IT数字化转型值得一提的是,凭借优秀的技术硬实力,华为云UGO曾获得DTCC2020“年度最佳创新解决方案奖”,并高分通过信通院2021年“数据库应用迁移服务能力”评测,得到业界权威机构认可。技术无止境,坚持创新、持续深耕技术的华为云UGO未来会更优秀! Ps :目前华为云UGO火热公测中,欢迎各位前来免费体验>>https://www.huaweicloud.com/product/ugo.html
  • [其他] explain performance 显示的执行时间短 gsql返回的时间长
    【问题分析】gsql 打开 \timing 看到执行的时间很长,耗时166S在explain performance 中看到的时间只有 257ms【根因分析】有其它线程在做DDL操作,锁冲突的时间没有记录在explain performance中。
  • [技术干货] SQL 语法
    SQL 语法规则SQL语句总是以关键字开始,如SELECT、INSERT、UPDATE、DELETE、DROP、CREATE。SQL语句以分号结尾。SQL不区分大小写,意味着update与UPDATE相同。数据库表 数据库通常包含一个或多个表。每个表都用一个名称标识(例如,"Customers"或"Orders")。该表包含带有数据(行)的记录。 在本教程中,我们将使用著名的Northwind示例数据库(包括MSAccess和MSSQLServer)。 下面是选自 "Customers" 表的数据:CustomerID    CustomerName    ContactName    Address    City    PostalCode    Country1Alfreds Futterkiste    Maria Anders    Obere Str. 57    Berlin    12209    Germany2    Ana Trujillo Emparedados y helados    Ana Trujillo    Avda. de la Constitución 2222    México D.F.    05021    Mexico3    Antonio Moreno Taquería    Antonio Moreno    Mataderos 2312    México D.F.    05023    Mexico4Around the Horn    Thomas Hardy    120 Hanover Sq.    London    WA1 1DP    UK5    Berglunds snabbköp    Christina Berglund    Berguvsvägen 8    Luleå    S-958 22    Sweden 上面的表包含五条记录(每一条对应一个客户)和七个列(CustomerID、CustomerName、ContactName、Address、City、PostalCode 和 Country)。SQL 语句 您需要在数据库上执行的大部分操作都是使用SQL语句完成的。 以下SQL语句选择“Customers”表中的所有记录:实例SELECT * FROM Customers; 在本教程中,我们将向您解释各种不同的SQL语句。请记住...SQL 对大小写不敏感:SELECT 与 select 是相同的。在本教程中,我们将以大写形式编写所有SQL关键字。SQL 语句后面的分号?一些数据库系统需要在每个SQL语句的末尾使用分号。分号是分离数据库系统中每个SQL语句的标准方法,这样您就可以在对服务器的同一请求中执行多个SQL语句。在本教程中,我们将在每个SQL语句的末尾使用分号。一些最重要的 SQL 命令SELECT - 从数据库中提取数据UPDATE - 更新数据库中的数据DELETE - 从数据库中删除数据INSERT INTO - 向数据库中插入新数据CREATE DATABASE - 创建新数据库ALTER DATABASE - 修改数据库CREATE TABLE - 创建新表ALTER TABLE - 变更(改变)数据库表DROP TABLE - 删除表CREATE INDEX - 创建索引(搜索键)DROP INDEX - 删除索引。来源。SELECT语句 句法:SELECT column_name(s) FROM table_nameSELECT语句和WHERE子句 句法:SELECT [*] FROM [TableName] WHERE [condition1]SELECT语句与WHERE和/或子句 句法:SELECT [*] FROM [TableName] WHERE [condition1] [AND [OR]] [condition2]...SELECT语句与ORDER BY 句法:SELECT column_name()FROM table_nameORDER BY column_name() ASC or DESCSELECT  DISTINCT(区分)子句 句法:SELECT DISTINCT column1, column2....columnNFROM   table_name;SELECT  IN子句 句法:SELECT column1, column2....columnNFROM   table_nameWHERE  column_name IN (val-1, val-2,...val-N);SELECT LIKE (类)子句 句法:SELECT column1, column2....columnNFROM   table_nameWHERE  column_name LIKE { PATTERN };SELECT  COUNT(计数)子句 句法:SELECT COUNT(column_name)FROM   table_nameWHERE  CONDITION;SELECT与HAVING子句 句法:SELECT SUM(column_name)FROM   table_nameWHERE  CONDITIONGROUP BY column_nameHAVING (arithematic function condition);INSERT INTO语句 句法:INSERT INTO table_name (column, column1, column2, column3, ...)VALUES (value, value1, value2, value3 ...)UPDATE语句 句法:UPDATE table_nameSET column=value, column1=value1,...WHERE someColumn=someValueDELETE语句 句法:DELETE FROM tableNameWHERE someColumn = someValueCREATE 语句 句法:CREATE TABLE table_name(column1 datatype,column2 datatype,column3 datatype,.....columnN datatype,PRIMARY KEY( one or more columns ));
  • [其他问题] 【DWS产品】DWS查询DN上残留的会话显示业务SQL运行了7849 days (21年)
    不多说,直接上图。单位错了么 ?   
  • [运维管理] GaussDB A 8.0.0.1 版本集群 是否有方式或方法可以判断笛卡尔积sql?
    【操作步骤&问题现象】GaussDB A 8.0.0.1 版本集群 是否有方式或方法可以判断产生笛卡尔积的sql?
  • 华为云GaussDB专场直播第5期:SQL优化解读
    1.前言在关系型数据库中,优化器是数据库的核心组件之一,由于一些列因素都会影响语句的执行,优化器综合权衡各个因素,在众多的执行计划中选择认为是最佳的执行计划。随着大数据时代的到来,像电商、游戏、电信等行业都大规模的应用,单一数据库节点是难以应对数据规模的不断增长并确保性能的需要,业务面临“存不下、算得慢、算不准”的问题。而GaussDB采用了可横向扩展的分布式架构,可以很好满足大规模海量数据的存储和计算的需求,其通过目标SQL执行计划的CBO成本,从目标SQL的诸多执行计划中选取成本值最小的执行路径为其执行计划,各执行路径的成本值是根据目标SQL中涉及到的表、索引、列等相关对象的统计信息计算出来的,实际反应执行目标SQL所要消耗的I/O、CPU和网络资源的一个估计值。I/O资源:把表的数据从磁盘读入内存时所需代价CPU资源:处理内存中表的数据所需的代价网络资源:需要DN间数据交互的分布式SQL,在实际执行时所需要的数据并不在本地DN中(需要从其他DN中取数据),便会将网络资源消耗折算成对等的I/O资源消耗再进行估算。本文结合第5场直播内容从分布式并行执行框架、分布式执行计划等方面进行介绍。2.分布式并行执行框架2.1执行器:PIPELINE模型GaussDB的执行器特点是:按照查询计划树从底往上执行,基于火山模型执行,即每个节点执行返回一行记录给父节点。火山模型的最大优点就是可以按需请求,每次只取出一条元组,在处理本条元组后,系统将会取出下一条满足条件的元组,直到取出所有满足条件的元组为止。从这种方式的运行机制可以看出,其每次执行时对于系统资源的需求都非常小。2.2 高性能分布式查询引擎GaussDB充分利用当前多核特点,通过多线程并发执行,提高系统吞吐量。众所周知,在传统的分布式 MPP 数据库中,因数据的重分布,也就是数据shuffle的代价非常昂贵,从而限制了用户使用场景范围。GaussDB能充分利用当前多核特点,采用并行执行机制,在SQL执行优化方面有多年的沉淀,并提供了三种stream流(广播流、聚合流和重分布流)来降低数据在DN节点间的流动,突破了传统分布式 MPP 数据库因为数据shuffle代价高昂带来的用户使用场景限制,即使是复杂的SQL、事务分析混合(HTAP)场景也能得到最佳执行。GaussDB的大致执行过程:业务应用下发SQL给Coordinator ,SQL可以包含对数据的CRUD操作;Coordinator利用数据库的优化器生成执行计划,每个DN会按照执行计划的要求去处理数据;数据基于一致性Hash算法分布在每个DN,因此DN在处理数据的过程中,可能需要从其他DN获取数据,GaussDB提供三种stream流(广播流、聚合流和重分布流)实现数据在DN间的流动,使得join无需抽取到CN执行;DN将结果集返回给Coordinate进行汇总;Coordinator将汇总后的结果返回给业务应用。3.分布式执行计划CN根据表的分布列信息和关联列信息进行判定,SQL语句是否可以直接在各个DN上执行而且不需要数据交流,如果是,CN采用LIGHT_QUERY或FQS_QUERY流程,保持了事不关己的态度,你发给我什么我就下发什么,直接将整个query命令下发给DN执行,执行完成后直接输出;如果需要在各个DN之间进行数据交互,则会选择使用stream算子;如果发现无法使用stream算子时,就回到了原始的PGXC流程。3.1 LIGHT_QUERY  - 场景:语句可以直接在一个DN执行(单shard语句,点查场景)。  - 原理:CN直接下发语句QPBE报文到对应DN,这样的做的好处是,执行效率高,线性扩展比好。create table t1 ( col1 int, col2 varchar ) distribute by hash(col1); create table t2 ( col1 int, col2 varchar ) distribute by hash(col1);3.2 FQS_QUERY   - 场景:当语句可以完全下推到多个DN上执行,且DN之间不需要数据交互时。  - 原理:CN不通过优化器,直接生成RemoteQuery计划,走执行器逻辑下发到DN,各DN根据下推语句生成执行计划并进行执行,执行结果在CN上进行汇总。create table t1 ( col1 int, col2 varchar ) distribute by hash(col1); create table t2 ( col1 int, col2 varchar ) distribute by hash(col1);LIGHT_QUERY和FQS_QUERY的最大异同点在于,虽然CN都是经过判定后直接把收到的query下发给DN进行处理,但是LIGHT_QUERY只涉及到单DN进行操作,而FQS_QUERY涉及到多个DN分别进行操作,它们都不会涉及到DN间的数据交互。3.3 STREAM GATHER   - 场景:需要各DN之间进行数据交互。   - 原理:CN根据原语句通过优化器生成带stream算子的执行计划,下发给DN进行执行,DN执行过程中存在数据交互(stream节点),stream算子在DN之间建立连接进行数据交互,CN汇总执行结果并承担大部分计算。create table t1 ( col1 int, col2 varchar ) distribute by hash(col1); create table t2 ( col1 int, col2 varchar ) distribute by hash(col2);3.4 STREAM REDISTRIBUTE   - 场景:需要各DN之间进行数据交互。   - 原理:CN根据原语句通过优化器生成带stream算子的执行计划,下发给DN进行执行,各DN执行过程中存在数据交互(stream节点),stream算子在DN之间建立连接进行数据交互,CN汇总执行结果并承担大部分计算。create table t1 ( col1 int, col2 varchar ) distribute by hash(col1); create table t2 ( col1 int, col2 varchar ) distribute by hash(col2);3.5STREAM BROADCAST   - 场景:需要各DN之间进行数据交互。   - 原理:CN根据原语句通过优化器生成带stream算子的执行计划,下发给DN进行执行,各DN执行过程中存在数据交互(stream节点),stream算子在DN之间建立连接进行数据交互,CN汇总执行结果并承担大部分计算。create table t1 ( col1 int, col2 varchar ) distribute by hash(col1); create table t2 ( col1 int, col2 varchar ) distribute by hash(col2);使用REDISTRIBUTE算子时,数据进行重分布可以充分利用多个节点的算力,而BROADCAST算子主要用于stream的子计划产生的数据量较少的情况,此时BROADCAST的代价较少。3.6 PGXC   - 场景:不能满足前面处理方式的极端场景,性能非常差。   - 原理:CN通过优化器把原语句中的部分语句生成RemoteQuery计划,把每个RemoteQuery下发到DN,DN执行后把中间结果数据发送给CN,CN收集后进行剩余执行计划的执行计算,CN承担了大部分计算。总结综上所述,GaussDB作为自主研发的新一代金融级分布式关系型数据库,采用可横向扩展的分布式架构,通过SQL优化器生成分布式算子以及分布式执行计划,提供了三种stream流(广播流、聚合流和重分布流)来降低数据在DN节点间的流动;执行引擎是一个分布式并行执行框架,支持节点间并行和节点内并行能力,充分利用当前多核特点,通过并发执行,提高系统吞吐量,具备大数据下高性能查询能力。  Ps:更多精彩内容,请点击回播链接进行观看:cid:link_0 
总条数:865 到第 页
上滑加载中