• [其他] 学习笔记(3)—GaussDB(for MySQL)进阶函数
    GaussDB(for MySQL)提供了非常多的函数供用户使用,除了经常使用的集聚函数、字符处理函数、日期函数外,还包括正则表达式函数、JSON函数、窗口函数等等。另外,用户也可以编写具有特定功能的SOL语句集,将其存储在数据库中,便于后续反复调用来简化对于某种功能的操。常用函数TRIM说明:将字符串str前后包含remstr部分删除。示例: SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx');LTRIM说明:删除str开头的空格。示例:SELECT LTRIM(' bar');RTRIM说明:删除str结尾的空格。示例:SELECT LTRIM('bar ');RPAD说明:在字符串str右侧使用padstr填充使其长度为len,若字符串长度超过len则接断。示例:SELECT RPAD('hi',5,'?');LPAD说明:在字符串str左侧使用padstr填充使其长度为len,若字符串长度超过len则接断。示例:SELECT RPAD('hi',5,'?');RAND说明:返回一个大于等于0小于1的浮点数。示例:SELECT FLOOR(7+RAND()*5);MD5说明:MD5(str): 为字符串计算一个 MD5(128比特校验和。该值以32位十六进制数字的二进制字符串的形式返回,若参数为 NULL 则会返回 NULL。示例:SELECT MD5('abc');SHA1、SHA说明:为字符串计算一个 SHA-1校验和。该值以40位十六进制数字的二进制字符串的形式返回,若参数为 ULL 则会返 NULL。示例:SELECT SHA1('abc');流控制函数CASE说明:当compare_value/conditon被满足时,返回对应的r否则返回ELSE语句后的result,如果没有ELSE语句,则返回NULL 。case表达式的返回类型是所有返回值的兼容聚合类型,而且取决于使用它的上下文如果在上下文中使用字符串,结果将返回为字符串。如果在上下文中使用数字,结果返回为十进制、实数或整数值。示例:CASE case_expression WHEN when_expression_1 THEN commands WHEN when_expression_2 THEN commands ... ELSE commandsEND CASE;IF说明:当expr1为true(expr1<>0 并且 expr1 <> NULL),if() 返回结果为expr2,否则返回expr3。IF()返回的结果是数值类型还是字符串类型,取决于具体的使用场景:如果expr2或expr3中只有一个为NULL,那么IF函数的结果头型为不是NULL的那一个表达式的结果类型。如果expr2或expr3的结果为string类型,那么IF()函数的返回结果为string。如果expr2或expr3的结果类型为浮点型,那么IF()函数的返回结果为浮点型。如果expr2或expr3的结果类型为整型,那么IF()函数的返回结果为整型。示例:SELECT IF(1>2,2,3);IFNULL说明:如果expr1不是NULL,则结果返回expr1,否则返回expr2。示例:SELECT IFNULL(NULL10);NULLIF说明:如果expr1=expr2,则结果返回NULL,否则返回expr1。示例:SELECT NULLIF(1,2);JSON函数JSON_ARRAY说明:创建JSON数组。示例:SELECT JSON_ARRAY(1, "abc", NULL);JSON_OBJECT说明:创建JSON对象。示例:SELECT JSON_OBJECT('id', 87, 'name', 'carrot');JSON_CONTAINS说明:查询json文档是否在指定path包含指定的数据,包含则返回1,否则返回0。如果有参数为NULL或path不存在,则返回NULL。示例:mysql> SET @j = '{"a": 1, "b": 2, "c": {"d": 4}}';mysql> SET @j2 = '1';mysql> SELECT JSON_CONTAINS(@j, @j2, '$.a');`+-------------------------------+| JSON_CONTAINS(@j, @j2, '$.a') |+-------------------------------+| 1 |+-------------------------------+``JSON_CONTAINS_PATH说明:检查一个 JSON 文档中在指定的路径上是否有值存在。示例:SELECT JSON_CONTAINS_PATH('[1, 2, {"x": 3}]', 'all', '$[0]') as `$[0]`;JSON_EXTRACT说明:从json文档里抽取数据。如果有参数有NULL或path不存在,则返回NULL。如果抽取出多个path,则返回的数据封闭在一个json array里。示例:SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]');+--------------------------------------------+| JSON_EXTRACT('[10, 20, [30, 40]]', '$[1]') |+--------------------------------------------+| 20 |+--------------------------------------------+mysql> SELECT JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]');+-----------------------------------------------+| JSON_EXTRACT('[10, 20, [30, 40]]', '$[2][*]') |+-----------------------------------------------+| [30, 40] |+-----------------------------------------------+JSON_KEYS说明:返回一个包含了指定的 JSON 对象中最上层的成员 (key) 的数组。示例:SELECT JSON_KEYS('{"x": 1, "y": 2, "z": 3}');JSON_OVERLAPS说明:检测两个 JSON 文档是否拥有任何一个相同键值对或数组元素。示例:SELECT JSON_OVERLAPS('[1, 2, 3]', '[3, 4, 5]');JSON_SEARCH说明:返回一个给定字符串在一个 JSON 文档中的路径。示例:SELECT JSON_SEARCH('[ { "name": "Tim", "age": 20, "hobbies": [ { "name": "Car", "weight": 10 }, { "name": "Sports", "weight": 20 } ] }, { "name": "Tom", "age": 20, "hobbies": [ { "name": "Reading", "weight": 10 }, { "name": "Sports", "weight": 20 } ] } ]', 'one', 'Tim');JSON_VALUE说明:从一个指定的 JSON 文档中提取指定路径的值并返回。示例:SELECT JSON_VALUE('[ { "name": "Tim", "age": 20, "amount": 123.456, "note": "He is perfect." }, { "name": "Tom", "age": 20, "amount": 456.1 } ]', '$[0].age');JSON_ARRAY_APPEND说明:向 JSON 文档中的指定的数组中追加一个值并返回修改后的 JSON 文档。示例:SELECT JSON_ARRAY_APPEND('[1, 2, 3]', '$', 4);JSON_ARRAY_INSERT说明:向 JSON 文档中的指定的数组中的指定位置插入一个值并返回新的 JSON 文档。示例:SELECT JSON_ARRAY_INSERT('[1, [2, 3], {"a": [4, 5]}]', '$[0]', 0);JSON_REMOVE说明:移除指定路径的数据,如果某个路径不存在则略过此路径。如果有参数为NULL,则返回NULL。示例:mysql> SET @j = '["a", ["b", "c"], "d"]';mysql> SELECT JSON_REMOVE(@j, '$[1]');+-------------------------+| JSON_REMOVE(@j, '$[1]') |+-------------------------+| ["a", "d"] |+-------------------------+JSON_REPLACE说明:在一个 JSON 文档中替换已存在的数据并返回新的 JSON 文档。示例:SELECT JSON_REPLACE('[1, [2, 3]]', '$[0]', 0, '$[2]', 6);JSON_DEPTH说明:返回一个 JSON 文档的最大深度。示例:SELECT JSON_DEPTH('[]'), JSON_DEPTH('[1, 2]'), JSON_DEPTH('[1, [2, 3]]');JSON_LENGTH说明:返回 JSON 文档或者 JSON 文档中通过路径指定的节点的长度。示例:SELECT JSON_LENGTH('[]') as `[]`, JSON_LENGTH('[1, 2]') as `[1, 2]`, JSON_LENGTH('[1, {"x": 2}]') as `[1, {"x": 2}]`;
  • [问题求助] GaussDB 与 MySQL 兼容性上有那些差异?是否能支持 JDBC 游标操作?
    GaussDB 与 MySQL 兼容性上有那些差异?是否能支持 JDBC 游标操作?
  • [问题求助] 【GussDB for MySQL】只读节点是基于ClickHose的MaterializeMySQL 引擎吗
    根据这篇博文《海量数据分析更快、更稳、更准!GaussDB(for MySQL) HTAP只读分析特性详解》,里面介绍了GaussDB for MySQL的只读特性,请问只读特性中只读节点时基于ClickHose的MaterializeMySQL 引擎修改的吗?还是基于只读节点的自研列存存储只读方案?
  • [问题求助] 外部服务器能否访问GaussDB(for MySQL)数据库
    外部服务器能否访问GaussDB(for MySQL)数据库
  • [互动交流] RPA通过控件 写入到excel表格内容,怎么执行了 表格里没有信息呢?
    表格里没有数据,是需要执行其他的控件吗
  • [问题求助] Data studio打开显示同一用户不能打开多个实例
    打开Data Studio就显示这个官方的手册也没有答案:求大佬解答
  • [活动公告] 【HCSD】潜力测试:华为云数据库技能测评来啦~
    未来5年将是国产数据库的主战场。数据库作为竞争最激烈的国产软件赛道,在技术服务、人才发展等方面有着巨量需求。华为云数据库测评热身,快速了解自身数据库水平,闯关So-easy,还有华为手表GT2、无线耳机、华为手环4等万元奖品拿!活动对象:开发者、高校师生、对数据库感兴趣的0基础用户活动内容:参与方式:1、微信扫码报名2、点击链接直接报名活动参与测试【HCSD】潜力测试:华为云数据库技能测评3、扫描官方二维码进行报名测评规则:测评内容:了解数据库的基础理论如关系、表、事务等,SQL基础知识;测评共 (20) 道题,总分100分,通过测评分数80分;需在(60分钟)内交卷,过程中无法暂停,请提前安排好时间;如未及时交卷,则本次考试作废推荐使用Chrome浏览器,或Firefox浏览器本测试2小时内只允许答题一次完成 “华为云数据库自测题”奖励:“华为云数据库自测题”奖励奖品奖品数量HUAWEI FreeLace无线耳机10华为手环4/hilink保温杯20罗技鼠标5032 U盘80加湿器100手机支架100字母笔100文件夹100中奖率是通过自测题人数的20%,实际奖品发放数量将按照奖品数量上限的比率提供。活动规则及注意事项请务必使用个人实名账号参与活动(IAM、企业账号等账号参与无效)抽奖形式:活动结束后,将参与数据导入第三方开源抽奖平台进行抽奖,抽奖过程全程透明公开。抽奖结束后将在此贴公布结果&收集收货信息。为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等影响活动公平性的行为),利用资源从事违法违规行为的用户收回抽奖及奖励资格。所有参加本活动的用户,均视为认可并同意遵守《华为云用户协议》,包括以援引方式纳入《华为云用户协议》的《可接受的使用政策》、《法律声明》、《隐私政策声明》、相关服务等级协议(SLA),以及华为云服务网站规定的其他协议和政策(统称为“云服务协议”)的约束。如果您不同意本活动规则和云服务协议的条款,请勿参加本活动。活动奖品颜色随机,且部分奖品数量有限发完将用等值奖品代替本次活动一个实名认证账号只能对应一个获奖人,如同一账号填写多个不同获奖人,不予发放奖励本活动最终解释权归华为云所有,活动规则由华为云在法律规定范围内进行解释。华为云保留不时更新、修改或删除本活动规则的权利。上述更新、修改或删除于公布时即时生效,用户应当主动查阅本活动规则的最新内容。
  • 取消用户的有效期
    执行了Alter user username valid until ‘2022-01-01 00:00:00’;使密码有效期到2022年1月1号,怎么取消这个有效期的设置,而不是延长?
  • [常见问题汇总帖] 使用JDBC连接opengauss密态数据库时,出现no gauss_cl_jni in java.library.path的报错
    如图,想问下要怎么解决。选择的jar包是:gsjdbc4.jar而且很奇怪的是,没有设置enable_ce=1时,就能成功连接,设置后才会出现报错。
  • [热门活动] 【HCSD】潜力测试:华为云数据库技能测评,你敢来挑战吗?
    未来5年将是国产数据库的主战场。数据库作为竞争最激烈的国产软件赛道,在技术服务、人才发展等方面有着巨量需求。华为云数据库测评热身,快速了解自身数据库水平,闯关So-easy!还有HUAWEI WATCH GT2、无线耳机、华为手环4等万元奖品拿!活动时间:2022年11月8~12月31活动对象:开发者、高校师生、对数据库感兴趣的0基础用户 活动内容:  参与方式:         点击参与   GOGOGO!!!     测评规则:测评内容:了解数据库的基础理论如关系、表、事务等,SQL基础知识;测评共 (20) 道题,总分100分,通过测评分数80分;需在(60分钟)内交卷,过程中无法暂停,请提前安排好时间;如未及时交卷,则本次考试作废推荐使用Chrome浏览器,或Firefox浏览器本测试2小时内只允许答题一次有问题可添加小助手微信18209232786激励规则:1.“邀请好友”激励:“邀请用户”奖励有效邀请人数奖品奖品数量X≥5圆领T恤/(加湿器、手机支架、字母笔、U盘、文件夹),任选二,随机发200X≥10荣耀体脂称2/折叠烧水壶50X≥15茶壶套装/HUAWEI mini蓝牙音箱 _绮境森林70X≥30华为手环4/保温杯/HUAWEI背包70X≥50HUAWEI FreeLace无线耳机活力版曜石黑+华为10000mA移动电源20X≥100HUAWEI WATCH GT2 运动款32MB+ 4GB曜石黑5有效邀请指,邀请来的用户需要完成活动报名,并通过自测题2.完成 “华为云数据库自测题”奖励:“华为云数据库自测题”奖励奖品奖品数量HUAWEI FreeLace无线耳机10华为手环4/hilink保温杯20罗技鼠标5032 U盘80加湿器100手机支架100字母笔100文件夹100中奖率是通过自测题人数的20%,实际奖品发放数量将按照奖品数量上限的比率提供。抽奖形式:活动结束后,将参与数据导入第三方开源抽奖平台进行抽奖,抽奖过程全程透明公开。抽奖结束后将在此贴公布结果&收集收货信息。活动其他事宜通知○所有活动奖品将在活动结束后20个工作日内完成发放;○活动奖品颜色随机,且部分奖品数量有限发完即止,如对应奖品无库存会更换等价奖品;○活动奖品需要进行华为云账号实名认证后领取;○为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等破坏活动公平性的行为),利用资源从事违法违规行为的用户收回抽奖及奖励资格。○本活动规则由华为云在法律规定范围内进行解释。华为云保留不时更新、修改或删除本活动规则的权利。○本次活动回帖内容需满足华为云论坛发帖规范:cid:link_1
  • [云服务] 【数据使能】RDS for MySQL能力项
    分类文档链接备注最新动态cid:link_5特性清单cid:link_4原子APIcid:link_3FAQcid:link_2华为云在线课程(免费)7天玩转MySQL基础实战营cid:link_0本课程内容包括MySQL入门学习共6个方面的讲解,最后通过共享MySQL在中小企业应用的最佳实践对知识点进行巩固。数据库高级特性cid:link_1HCIP-GaussDB-OLTP V1.5系列课程。本课程主要介绍华为云数据库GaussDB(for MySQL)的高级特性,包括:海量存储能力、备份恢复实现机制、秒级主备切换、分钟级弹性扩展、并行执行及NDP算子下推等,帮助用户更好地了解和使用GaussDB(for MySQL)。华为云开发者网云数据库 RDS开放能力cid:link_6
  • [热门活动] 【热门直播】云数据库时代,DBA将走向何方?
    云数据库时代,数据库软件越来越成熟和智能,作为数据库管理员的DBA将面临哪些机遇和挑战?又应该具备什么能力,才能应对未来的不确定性?10月10日19:00,三位数据库大咖带你走进《云数据库时代,DBA将走向何方?》主题直播,与您共同探讨DBA的未来转型及出路。报名直播将送499元代金券,还有移动电源、公牛插座等更多好礼等你来!点击:观看直播
  • [技术干货] IAM用户批量创建!
    因图片加载等问题,具体详细的流程,请在最下方附件部分进行下载。一、购买项目管理ProjectMan服务登录华为云官网:cid:link_0,输入账号及密码,登录。进入控制台,选择区域,例如“华北-北京四”,在“开发与运维”中选择“项目管理ProjectMan”.单击“购买DevCloud”。按如下配置购买免费使用的基础版软件开发平台。单击“确认付款”完成购买。单击“返回控制台”。二、批量创建IAM用户选择“立即使用”阅读声明后,勾选 “我已阅读并同意以上使用声明”后,单击“确定”。鼠标移动至右上角个人帐号,单击“租户设置”。单击“批量导入子帐号”选择“下载模板”。在模板中填写子账号名和帐户邮箱。模板单次最大支持100个成员的批量导入。模板填写完成后,勾选“我已阅读并同意……”后单击上传模板按钮进行上传。在控制台选择IAM服务,检查IAM是否已成功创建。IAM 用户创建成功后,其邮箱将收到登录信息,首次登录需修改密码。
  • [热门活动] 【报名有奖】第8届互联网+华为云GaussDB命题大赛报名啦!
    活动时间:2022/7/5-2022/7/31活动福利:(1)活动期间在互联网+大赛华为云GaussDB企业命题页面成功报名的前50支队伍,每支队伍将获得价值199元的华为手环4一个(每支队伍派1人申领)。(2)若成功报名且提交有效作品的Top10队伍,可获得礼品升级机会,每支队伍将获得价值999元的华为无线耳机freebuds4。活动流程:Step1. 在大创网完成华为云GaussDB命题的报名https://cy.ncss.cn/mtcontest/detail?id=8a80808d81197da0018119acfb1904ebStep2. 请申领人添加华为云数据库小助手完成报名截图确认与校验(小助手微信号:18209232786)Step3. 请填写问卷信息,用于最终奖品发放,为了避免后续联系不到中奖者,请正确填写收货信息https://devcloud.huaweicloud.com/expertmobile/qtn?id=3701b5c4cfb141feb4d89a988f918627在大创网完成华为云GaussDB命题的报名【奖品发放】活动结束后,小助手审核通过且活动结束后统一发放奖品,预计8月1号启动发放~
  • [技术干货] GaussDB创新特性解读:Partial Result Cache,通过缓存中间结果对算子进行加速
    为了加速查询性能,传统的关系型数据库,比如Oracle、DB2,都有结果集缓存的特性,用来缓存一条查询语句的结果集。如果后续同样的语句被查询,数据库将直接从结果集缓存中获取结果,而不用再重新执行该查询。MySQL 在4.0版本中也引入了结果集缓存Query cache,但是在设计上有局限性,具体如下: Query cache针对单个查询,任何一个表做了修改,如果影响到结果集就需要刷新或者失效。Query cache对隔离级别有依赖,不同的隔离级别产生的结果集不一样。Query cache需要对所有数据进行缓存,如果表结果比较大的话,缓存需要占据较大的内存或者写入磁盘。这也导致了该特性在MySQL 8.0版本被移除。鉴于结果集缓存对查询性能的增益,我们在GaussDB(for MySQL)引入Partial result cache这一新特性,简称PTRC。顾名思义,这也是一个结果集缓存特性。不同于传统的结果集缓存,PTRC是用来辅助单个查询的内部算子的执行。也就是说PTRC粒度更小,是对查询内部的某个算子的中间结果进行缓存,从而起到算子加速的作用。这里的Partial 有两层概念:从这两点可以看出,PTRC是与单个查询相关的,生命周期从查询开始到查询结束,自动终止。由于它是对算子进行加速,所以一个查询内部可以有多个PTRC。只要优化器根据代价计算,认为该算子适合PTRC,那么优化器就会为该算子引入PTRC。PTRC如何确定对算子并加速?这里我们引入一个新概念:参数化的重复扫描,指的是扫描算子根据参数的不同进行算子扫描。比如Nested Loop Join,对于外表扫描的每一条数据,内表会根据JOIN条件进行扫描,那么对于内表来说就是一次“参数化的重复扫描”。再比如correlated subquery,对于父查询的每一次扫描都会根据父查询的结果集调用子查询执行,然后返回子查询的结果集。PTRC是如何工作的?如前所述,PTRC是缓存算子的中间结果集,那么也和其他cache一样,将数据以key ,value的方式缓存到cache中,通过key来命中,得到value。那么PTRC的相关key和value是如何获取的?下面我们以Correlated subquery为例做简单分析,查询语句如下:SELECT *FROM   t1WHERE  t1.a IN (SELECT a                FROM   t2,                       t3                WHERE  t2.b = t1.b                       AND t2. c > t3.d); 上图是子查询使用EXISTS策略执行的流程图。可以看出:对于数据表t1中的每一条数据,都会驱动子查询执行,直到数据表t1中的所有记录都循环结束。对于数据表t1中的每一条记录对应的t1.a,都需要根据该列值重**描子查询,进而判断子查询的返回值。我们通过EXPLAIN来对比引入PTRC前后执行计划的差异:EXPLAIN format=treeSELECT *FROM   t1WHERE  t1.a IN (SELECT a                FROM   t2,                       t3                WHERE  t2.b = t1.b                       AND t2. c > t3.d);-> Filter: <in_optimizer>(t1.a,<exists>(select #2))  (cost=0.35 rows=1)    -> Table scan on t1  (cost=0.35 rows=1)    -> Select #2 (subquery in condition; dependent)        -> Result cache : cache keys(t1.a, t1.b)            -> Limit: 1 row(s)  (cost=0.80 rows=1)                -> Filter: (t2.c > t3.d)  (cost=0.80 rows=1)                    -> Inner hash join (no condition)  (cost=0.80 rows=1)                        -> Table scan on t3  (cost=0.35 rows=2)                        -> Hash                            -> Filter: ((t2.b = t1.b) and (<cache>(t1.a) = t2.a))  (cost=0.35 rows=1)                                -> Table scan on t2  (cost=0.35 rows=1)可以看出引入PTRC后,多了一个算子Result cache(标红部分),表明该算子当前的子查询引入了PTRC,引入后的执行流程变更为:引入PTRC后,对于数据表t1中的每一条数据对应的t1.a列值,优先查看PTRC,如果命中,直接从PTRC中获取结果集,而不需要执行子查询。如果未命中,需要按原来的方式继续执行子查询,子查询执行的结果会储存到PTRC中。如果下一次同样的列值来驱动执行子查询,可以直接从PTRC获取。优化器如何选择PTRC?优化器在为算子选择PTRC的时候会依赖代价估算,主要是看命中率(命中率 = 不同键值的行数/键值的总行数), 如果命中率大于rds_partial_result_cache_cost_threshold(具体含义参考下文的系统变量介绍)变量定义的最小代价,PTRC将会被选择,反之则不会被选择。是否选择了PTRC,可以通过Explain format=tree或者Explain **yze来观察实际的命中情况。我们通过一个例子来说明:EXPLAIN **yzeSELECT *FROM   t1WHERE  t1.a IN (SELECT a                FROM   t2,                       t3                WHERE  t2.b = t1.b                       AND t2. c > t3.d);-> Filter: <in_optimizer>(t1.a,<exists>(select #2))  (cost=0.35 rows=1) (actual time=3800.595..3800.595 rows=0 loops=1)    -> Table scan on t1  (cost=0.35 rows=1) (actual time=0.064..0.093 rows=1 loops=1)    -> Select #2 (subquery in condition; dependent)        -> Result cache : cache keys(t1.a, t1.b) (Cache Hits: 0, Cache Misses:1, Cache Evictions: 0, Cache Overflows: 0, Memory Usage: 40960 )  (actual time=0.115..0.115 rows=0 loops=1)            -> Limit: 1 row(s)  (cost=0.80 rows=1) (actual time=0.094..0.094 rows=0 loops=1)                -> Filter: (t2.c > t3.d)  (cost=0.80 rows=1) (actual time=0.093..0.093 rows=0 loops=1)                    -> Inner hash join (no condition)  (cost=0.80 rows=1) (actual time=0.092..0.092 rows=0 loops=1)                        -> Table scan on t3  (cost=0.35 rows=2) (never executed)                        -> Hash                            -> Filter: ((t2.b = t1.b) and (<cache>(t1.a) = t1.a))  (cost=0.35 rows=1) (actual time=0.039..0.039 rows=0 loops=1)                                -> Table scan on t2  (cost=0.35 rows=1) (actual time=0.038..0.038 rows=0 loops=1) 从Result cache这个算子后面可以看到:Cache Hits: 0,表示命中的次数为0Cache Misses:1,表示没有命中的次数为1Cache Evictions: 0,表示使用LRU淘汰的记录数Cache Overflows: 0,表示内存overflow的次数Memory Usage: 40960,表示当前查询使用的内存量 由于优化器使用代价估算来计算是否使用PTRC,如果估算错误的话,PTRC还是有额外的代价,比如创建自身的一些数据结构,以及记录的拷贝。为了尽可能的保证查询的性能,PTRC采取了动态反馈的方式来查看PTRC在实际执行的过程中是否继续使用。PTRC会自动判断命中率是否适合保留PTRC,优化器根据没有命中的次数,每隔rds_partial_result_cache_hit_ratio_frequency会检查命中率是否低于rds_partial_result_cache_min_hit_ratio。如果低于该值,优化器会自动禁止继续使用PTRC。 优化器如何限制PTRC的内存使用由于单个查询可以有多个PTRC算子,每个算子都会使用内存来存储缓存数据,那么控制PTRC内存使用就非常有必要,以防止内存OOM。通过系统变量rds_partial_result_cache_max_mem_size来定义每个查询所使用的所有PTRC算子使用的最大内存。如果PTRC使用的内存总数超过该值,优化器会根据LRU算法来进行淘汰。如果通过LRU算法可以找到适合当前存储记录的大小的记录进行淘汰,当前记录可以进行缓存,否则当前记录将不被缓存。PTRC如何配置? 首先,PTRC默认是开启的,可以通过Optimizer_switch中的partial_result_cache选项更改设置:设置为ON,启用PTRC,否则就关闭。通过下表中的4个系统变量,对PTRC进行具体设置。变量名说明rds_partial_result_cache_max_mem_size最大允许使用的内存大小rds_partial_result_cache_cost_threshold优化器选择PTRC的最小代价。如果优化器估算的代价超过该阈值,PTRC将会被选择,否则不会被选择rds_partial_result_cache_min_hit_ratio执行期间的最小命中率。如果命中率低于该值,PTRC将被动态关闭rds_partial_result_cache_hit_ratio_frequency执行期间检查命中率的频率。如果不能命中的次数达到了该值,PTRC将会触发检查命中率是否低于最小命中率。如果低于最小命中率,PTRC将自动失效。PTRC性能测试下面是我们使用TPCH的Q17来测试不同数据量下启用PTRC前后的性能变化。由于PTRC是一个cache,所以命中率越高性能提升就会越高。当然如果PTRC相关的算子执行代价越高的话,那么PTRC获取的性能提升也是越高的。 MariaDB的subquery cache是对重复扫描算子correlated subquery进行加速引入的一个特性,我们参照MariaDB的subquery cache测试样例,同样基于dbt-3 scale 1 数据集,测试PTRC对于correlated subquery的加速效果。由于MySQL和MariaDB索引创建的不同,执行时间与MariaDB不同,这里只需要关注相对时间即可。测试结果如下表所示:examplecache oncache offgainhitmisshit rate10. 5sec22 min 3.98 sec2,647x149975 2599.98%20.26sec1.2sec4.6x628522096.6%30.11sec0.14sec1.27x233777975%41.42sec1.43sec0x02000% 可以看出:上表中最后一行命中率为0的情况下,PTRC默认值检查如果miss了200条之后,会触发检查命中率,发现命中率太低了,所以PTRC自动失效了,所以可以看到miss列里只有200条。MariaDB的测试样例和结果请参考:https://mariadb.com/kb/en/subquery-cache/#performance-impact。PTRC对于参数化的重复扫描都可以进行适配,只要命中率足够,就可以加速执行。对于查询中的多种算子包括Correlated Subquery, Nested Loop Join, Semijoin, Antijoin都有加速作用。PTRC已经正式上线,欢迎大家使用。
总条数:179 到第 页
上滑加载中