DTSE Tech Talk 第18期丨统计信息大揭秘,数仓SQL执行优化之密钥

摘要:华为云EI DTSE技术布道师王跃,针对统计信息对于查询优化器的重要性,GaussDB(DWS)最新版本的analyze当前能力,与开发者和伙伴朋友们展开交流互动,帮助开发者快速上手使用统计信息的自动收集功能。

在本期《统计信息大揭秘——SQL执行优化之密钥》的主题直播中,我们邀请到华为云EI DTSE技术布道师王跃,针对统计信息对于查询优化器的重要性,GaussDB(DWS)最新版本的analyze当前能力,与开发者和伙伴朋友们展开交流互动,帮助开发者快速上手使用统计信息的自动收集功能。

为何要重视统计信息收集?

现阶段市场上的数据库产品,基本上都是基于CBO模型的优化器,在基于CBO模型的优化器中,统计信息是生成最优执行计划的前提,会直接影响到执行计划的选择,因此统计信息的及时收集是尤为重要的。

统计信息主要包括“描述表规模的表级统计信息”和“描述列数据特征的列级统计信息”两部分内容。

王跃从统计数据在优化器中的运用这一角度,向我们展示了统计信息影响表达小估算的原理、进行等值比较、范围比较、多条件、简单JOIN代价估算的原理,进一步解释了统计信息的重要性。

如何收集统计信息

王跃先带我们简单了解了GaussDB(DWS)的部署架构,说明了分布式查询的执行流程和统计信息收集的执行流程。

基于此,GaussDB(DWS)共有五种统计信息收集的方法,分别是按库收集、按表收集、按模式收集、按列收集以及多列组合。

GaussDB(DWS)拥有强大的统计信息自动收集能力,通过后台线程轮询收集与优化器同步收集两种方式来实现。王跃建议开发者可以同步开启两种方式,以达到最优的收集功能。

此外,还强调了自动收集的阈值控制方法,同时对收集不及时,统计信息可能失效的场景,提出了一种统计信息推算的兜底策略。确保每个查询都有及时有效的统计信息可用。保证了尽可能最优的执行性能。

华为云数仓analyze能力

通过“基本功能”,“收集方式”,“准确性”,“可靠性”,“估算增强”,详细的介绍了华为云GaussDB(DWS)近年来在统计信息方面的持续耕耘和比较有亮点的特色功能。

GaussDB(DWS)在analyze的各个执行过程中都进行了精心打造。统计信息是基于对目标数据的采样生成的,所以准确性才是统计信息的关键。

  1. 样本数据能不能代表全表数据特征?
  2. 如何找到一个恰当的采样大小,让统计信息收集的又快又准?
  3. 不同存储类型的表如何自适应的选取采样模型?
  4. 内存不足时应该如何计算统计信息?

在采样大小,采样模型,计算模型等方面的深入投入,GaussDB(DWS)寻找出了这些问题的最佳答案。

最后给出了一键式统计信息自动收集的最优配置,让用户不再担心统计信息忘记收集的烦恼,帮助开发者专注于自己业务领域,减少统计信息忘收集的困扰。

统计信息常见问题

我们知道了GaussDB(DWS)的统计信息自动收集功能很强大,那我们接下来更关心的是如何检测它的使用效果,如何知道收集的进度和方式。

如何判断统计信息是否失效,给用户提供了三种简单快速识别统计信息未收集的方法:

  1. 已知SQL执行慢,看是否有未收集统计信息的表;
  2. 批量作业执行慢,哪些SQL是没收统计信息;
  3. 通过日志查找历史未收集统计信息的表。

analyze易运维,通过非常巧妙的方法,将analyze每一步的执行过程和运行模式,详细的展示到活跃会话视图和线程等待视图,王跃也在最后列举了一些使用者最常问到关于analyze的几个TOP问题。

欢迎感兴趣的开发者们收看我们的直播回放,了解更多~

 

点击关注,第一时间了解华为云新鲜技术~

本文转载于网络 如有侵权请联系删除

相关文章

  • C++多态与虚函数

    Contents1C++多态概念2C++多态实例3C++多态总结4虚函数5多态应用6参考资料本文文学习笔记总结讲得比较浅显,更深入内容可以参考C++Primer。C++多态概念多态字面意思是一个事物有多种形态,在 C++ 程序设计中,多态性是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。多态可以分为编译时的多态和运行时的多态。编译时的多态:主要是指函数的重载(包括运算符的重载)、对重载函数的调用,在编译时就能根据实参确定应该调用哪个函数,因此叫编译时的多态;运行时的多态:和继承、虚函数等概念有关,这篇文章主要涉及运行时的多态。C++多态实例程序运行时的动态即动态多态性,这里要研究的问题是:当一个基类被继承为不同的派生类时,各派生类可以使用与基类成员相同的成员名,如果在运行时用同一个成员名调用类对象的成员,会调用哪个派生

  • GO、Rust这些新一代高并发编程语言为何都极其讨厌共享内存?

    ​今天我想再来讨论一下高并发的问题,我们看到最近以Rust、Go为代表的云原生、Serverless时代的语言,在设计高并发编程模式时往往都会首推管道机制,传统意义上并发控制的利器如互斥体或者信号量都不是太推荐。这里我们先来看一下并发和并行的概念,我们知道并发是一个处理器同时处理多个任务,这里同时是逻辑上的,而并行同一时刻多个物理器同时执行不同指令,这里的同时物理上的。并发是要尽量在目前正在执行的任务遇到阻塞或者等待操作时,释放CPU,让其它任务得以调度,而并行则是同时执行不同任务而不相互影响。而传统的信号量、互斥体的设计都是为了让单核CPU发挥出最大的性能,让程序在阻塞时释放CPU,通过控制共享变量的访问来达到避免冲突的目的,而想控制好这些共享变量的行为,其关键因此在于设计好时序,从本质上讲控制时序就是给系统加上红绿灯并配备路障,而这里你一定要记住,高性能系统需要的是立交桥、地下隧道这些基础设施,而不是交通信号等控制手段,好的并发系统一定要用流的概念来建模,而不是到处增加关卡路障。现在的处理都是多核架构,因此编程也要向并行倾斜,不过笔者在网上看到很多所谓标榜高并发教程中所举的例子,都

  • SpringBoot 字符串与对象相互转化封装

    packagecom.shadowolf.base_project.utils; importcom.fasterxml.jackson.core.JsonProcessingException; importcom.fasterxml.jackson.databind.ObjectMapper; importorg.springframework.util.StringUtils; importjava.io.IOException; publicclassJsonUtils{ privatestaticObjectMapperobjectMapper=newObjectMapper(); //对象转字符串 publicstatic<T>Stringobj2string(Tobj){ if(obj==null){ returnnull; } try{ returnobjinstanceofString?(String)obj:objectMapper.writeValueAsString(obj); }catch(JsonProcessingExceptione

  • 看看这样的程序排错经历是否似曾相识

    本文以开发应用程序过程中遇到的问题为背景,介绍了3种常见的排错思路。涉及到关键词如下日志重启数据库开发流程读完本文,你将对应用程序如何排错有新的认识和启发。LNMP架构应用程序日志排错介绍下开发语言和服务器环境,PHP7.2+LinuxCentOsLNMP指Linux+Nginx+Mysql+PHP程序部署后,出现如下图示php-fpm-500图中可以看到500错误,从服务角度来看,可以看出已经到达PHP-FPM层错误日志位置nginx层nginx.conf主配置文件站点vhostconf配置文件 error_log/var/log/error.logdebug;php-fpm层打开php-fpm.conf查看日志输出路径error_log=/var/log/error.log复制php层面 通过php--ini命令查询到php.ini的位置打开查看 ;error_reporting ;DefaultValue:E_ALL&~E_NOTICE&~E_STRICT&~E_DEPRECATED ;DevelopmentValue:E_ALL ;Production

  • 3D打印机器人手,进行不同风格的钢琴演奏

    编译:chux出品:ATYUN订阅号科学家们开发出一种3D打印的机械手,它可以通过移动手腕在钢琴上弹奏简单的乐句。虽然机器人远非艺术大师,但它展示了复制人手的功能是多么具有挑战性,以及通过设计还可以实现多少复杂的动作。剑桥大学的研究人员开发的机器人手是通过3D打印软质和刚性材料制成的,用于复制人手中的所有骨骼和韧带,但不是肌肉或肌腱。尽管与人手相比,这限制了机器人手的运动范围,但研究人员发现,依靠手的机械设计仍然可以实现很大范围的运动。使用这种“被动”运动,机器人能够模仿不同风格的钢琴演奏,而不会改变手的材料或机械特性。这项研究结果发表在《ScienceRobotics》上,它将有助于设计出能够更自然地运动、能耗最小的机器人。动物和机器中的复杂运动源于大脑(或控制器),环境和机械体之间的相互作用。系统的机械特性和设计对于智能功能非常重要,并且可以帮助动物和机器以复杂的方式移动,而不会消耗不必要的能量。“我们可以利用这种被动运动来实现机器人的广泛运动:例如,步行,游泳或飞行,”该论文的第一作者剑桥工程系的JosieHughes表示,“智能机械设计使我们能够以最小的控制成本实现最大范围的运

  • 插入排序算法:直接排序与折半排序

    排序算法大概可以分为五种:插入排序,交换排序,选择排序,归并排序和计数排序。这篇文章讨论一下,插入排序中的直接插入和折半插入。排序,归根结底它的作用是对表中的记录进行一个有序的归纳。一个排序,基本上都需要两个步骤:一是找到要插入的位置,二是移动记录。先来看一下插入排序的算法:/直接插入排序/voidStraight_Insert_Sort(Sqlist&L){intj;for(inti=2;i<=L.length;i++){L.R[0]=L.R[i];for(j=i-1;L.R[j].key>L.R[0].key;j--){L.R[j+1]=L.R[j];}L.R[j+1]=L.R[0];}}我们假定记录中的第一个关键字为有序,现在,需要将从第二个关键字开始的所有记录插入到表中。下面解释一下上述代码:从第二个数开始循环插入每一个数字,将L.R[0]定位哨兵,当需要被插入的数字出现时,将它的值赋给哨兵。这里利用到i之前的记录一定是有序的,所以循环比较哨兵与前面记录的值,从第i-1个数开始,依次往后移动。直到哨兵与所比较的值相等时,终止,这是一个稳定排序。下面来看一下折

  • 3.15消费者权益日|VR直击维权第一现场,讨回公道从我做起

    正文共:2064字9图预计阅读时间:6分钟很多人都有类似的经历:心心念念购买的商品,却存在严重的质量问题,想要维权却发现投诉无门。面对这样的情况,你会如何应对?是选择息事宁人、暗自吃下这闷亏?还是坚持维权,与厂商斗争到底?除非利益受到极大伤害,其他的都会采取“多一事不如少一事”的做法,草草收场。 为什么消费者维权那么困难?这难道不是一项消费者的基本权益?归根结底,不外乎以下几个原因:消费者维权意识淡薄、相关法律不熟悉且不了解、维权成本大以及相对性的厂受罚力度太轻。为了改变消费者维权难的现状,同时进一步扩大消费者权益保护的宣传,国际消费者联盟组织于1983年确定每年的3月15日为“国际消费者权益日”。今日恰逢第36个“国际消费者权益日”,作为VR垂直媒体的小编,就来和你们聊聊VR在维权、打假、普法等方面的应用,让我们借助高科技的手段,帮助消费者更好的维护自身权益。VR版3.15晚会,让消费更透明为维护消费者权益,从1991年起,每年中央电视台都会联合国家相关政府部门,举办3.15晚会。晚会上播出的调查节目一般都紧跟当下的消费热点,追踪消费生活中不为人知的“潜规则”,曝光侵害消费者权益的重

  • 学点算法之栈的学习与应用

    在学习栈前,脑海中对这个词只有一个印象:客栈栈是什么 栈(有时称为“后进先出栈”)是一个项的有序集合,其中添加移除新项总发生在同一端。这段话初学者是懵逼的,别急,往下看。对栈的一般操作:Stack()创建一个空的新栈。它不需要参数,并返回一个空栈。push(item)将一个新项添加到栈的顶部。它需要item做参数并不返回任何内容。pop()从栈中删除顶部项。它不需要参数并返回item。栈被修改。peek()从栈返回顶部项,但不会删除它。不需要参数。不修改栈。isEmpty()测试栈是否为空。不需要参数,并返回布尔值。size()返回栈中的item数量。不需要参数,并返回一个整数。例如,s是已经创建的空栈,下图展示了栈操作序列的结果。栈中,顶部项列在最右边。自己在心里过一遍就很好理解了Python实现栈 其实看到上面那张图,就想起了Python中list的一些用法,append、pop等,下面是使用Python来实现栈,也非常简单:classStack: def__init__(self): self.items=[] defisEmpty(self): returnself.item

  • 关于抓取session信息的一个脚本(r3笔记第8天)

    关于session的诊断,可以基于动态性能视图,ash,awr.. 自己也写过一些简单的脚本,在平时的工作中也能够完成一些基本的工作。今天在看taner分享的脚本snapper的时候,让自己眼前一亮,也发现自己存在着很多的不足的地方。 可以从脚本中看到他孜孜不倦的分享着自己的心得,而且自己也写了一些更加深入的一些工具集来解析oracle的技术细节。 脚本的功能很多,林林总总下来代码有近2000多行,功能点很多,自己看文档也简单尝试了几个。发现还不错。可以在平时的工作中也基于自己的需求来做一些修改。 taner也提供了一些其它脚本的下载链接。http://blog.tanelpoder.com/中可以看到有很多的技术博客,自己最近也是心浮气躁,没能静下心来好好总结,自己也需要更加努力。 简单示范几个脚本的使用例子。 比如我想多次抓取session的细节,可以通过如下的参数来辅助,下面的例子就是示范抓取所有的session信心,没5秒抓取一次,一共抓取2次 SQL>@snapperash=sid+event+wait_class+sql_id,ash1=sql_id52all Sam

  • 2022前端二面必会vue面试题汇总

    Vue中的key到底有什么用?key是为Vue中的vnode标记的唯一id,通过这个key,我们的diff操作可以更准确、更快速diff算法的过程中,先会进行新旧节点的首尾交叉对比,当无法匹配的时候会用新节点的key与旧节点进行比对,然后超出差异.diff程可以概括为:oldCh和newCh各有两个头尾的变量StartIdx和EndIdx,它们的2个变量相互比较,一共有4种比较方式。如果4种比较都没匹配,如果设置了key,就会用key进行比较,在比较的过程中,变量会往中间靠,一旦StartIdx>EndIdx表明oldCh和newCh至少有一个已经遍历完了,就会结束比较,这四种比较方式就是首、尾、旧尾新头、旧头新尾.准确:如果不加key,那么vue会选择复用节点(Vue的就地更新策略),导致之前节点的状态被保留下来,会产生一系列的bug.快速:key的唯一性可以被Map数据结构充分利用,相比于遍历查找的时间复杂度O(n),Map的时间复杂度仅仅为O(1).前端vue面试题详细解答vue-cli工程常用的npm命令有哪些下载node_modules资源包的命令:npminstall

  • Python - 字符串

    目录1.字符串和操作符1.1序列操作符切片2.内建函数3.字符串的独特特性3.1三引号3.2字符串不变性[参考文献] 字符串是不可变类型,改变一个字符串的元素需要新建一个字符串。 1.字符串和操作符 1.1序列操作符切片 删除一个字符串 >>>a='astring' >>>dela >>>a Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> NameError:name'a'isnotdefined 复制 虽然开始和结束索引值可以超过序列的长度,但直接取某个越界的值作为索引不被允许的。 >>>a='0123456' >>>a[-10:10] '0123456' >>>a[:10] '0123456' >>>a[10] Traceback(mostrecentcalllast): File"<stdin>",line1,in<module&g

  • 针对数组内容的增删改

    处理数组的方法很多,javascriptsplice()算是最强大的了,它可以用于插入、删除或替换数组的元素。下面来一一介绍!1.删除-用于删除元素,两个参数,第一个参数(要删除第一项的位置),第二个参数(要删除的项数)2.插入-向数组指定位置插入任意项元素。三个参数,第一个参数(其实位置),第二个参数(0),第三个参数(插入的项)3.替换-向数组指定位置插入任意项元素,同时删除任意数量的项,三个参数。第一个参数(起始位置),第二个参数(删除的项数),第三个参数(插入任意数量的项)看下面这段代码就明白了 varlang=["php","java","javascript"];//删除varremoved=lang.splice(1,1);alert(lang);//php,javascriptalert(removed);//java,返回删除的项//插入varinsert=lang.splice(0,0,"asp");//从第0个位置开始插入alert(insert);//返回空数组alert(lang);//asp,php,javascript//替换varreplace=lan

  • 关于我

    unbuntu18.04的下载与安装 注:由于大部分过程是以图片形式说明,所以可能会导致网页浏览不流畅 前言 有时候由于个人计算机中文件的频繁移动,导致虚拟机的镜像文件有时候莫名删除了或者不见了(说到底还是自己没有及时得到去做整理,唉);Ubuntu的话也不是常用,目前个人常用的还是Centos系列的Linux,但有时候也是会用到Ubuntu,所以在此做个记录;不然一些出现一些不可避免的傻瓜操作 下载 个人是选择了Ubuntu18.04desktop版,目前21.04的版本已经出来了。可能新版改了一些东西,但应该区别不是很大 官网下载链接:https://releases.ubuntu.com/18.04/ubuntu-18.04.5-desktop-amd64.iso 建议是采用下载工具下载,不然会很慢很慢 VMware安装Ubuntu 个人VMware的版本是16,版本新旧几乎不会有太大的影响 关于VmTools工具的安装 参考我的另一篇文章:安装VMTools失败的三类解决方法(Windows、Linux、MacOs)[https://www.cnblogs.com/yuy

  • Codeforces 670D. Magic Powder

    Wakingupinthemorning,Apollinariadecidedtobakecookies.Tobakeonecookie,sheneeds n ingredients,andforeachingredientsheknowsthevalue ai —howmanygramsofthisingredientoneneedstobakeacookie.ToprepareonecookieApollinarianeedstouseall n ingredients. Apollinariahas bi gramofthe i-thingredient.Alsoshehas k gramsofamagicpowder.Eachgramofmagicpowdercanbeturnedtoexactly 1 gramofanyofthe n ingredientsandcanbeusedforbakingcookies. Yourta

  • 如何保证FPGA PCIe唤醒能满足PC的100ms 的时间要求(Autonomous Mode)?

    原创ByDeeZeng[IntelFPGA笔记]  PC需要PCIe设备在100ms内启动,这样PC才能扫描到PCIe设备。对于FPGAPCIe板卡,同样也需要满足这个时间要求。  IntelFPGA系列是基于sram的,也就是掉电丢失,所以会需要配置器件。配置模式有很多种,以我们常见的ASx4和FPP为例: 1.ASx4:只需要一颗EPCS/PECQ即可配置 2.FPP :需要一个额外外部Host用来搬移配置数据,由于是并行x8x16x32,配置时间会少很多。 如下抽出两张CycloneV和Arria10的ASFPP配置时间差异    PCIe100ms或FPGA120ms的时间(请具体分析之后给出的Figure2-2,Table2-1图片),可不单纯包含FPGAconfigurationTime,还包含RampTime,PORTime等。 减去这两项时间,那FPGAconfiguration80ms左右的都有点不保险了。 也就是当我们CycloneV逻辑资源大的器件,或Arria10器件,当使用ASx4模式的时候,PCIe应用

  • 成都java软件技术培训机构

    互联网时代,人们纷纷羡慕IT软件行业的前景和“钱景”。有些行动力较强的更是摩拳擦掌,直接通过参加Java培训班来成功转行这一行业。但是由于市面上的培训机构鱼龙混杂,作为一个IT小白面对众多选择,只能两眼一抹黑。别怕,朗沃小编这就来告诉你,成都java软件技术培训机构哪家强。   第一招:机构的热门课程是否是Java IT培训机构很多,机构的课程也多,有的专注于Java培训,有的专注于软件测试培训,还有的专注UI设计培训,在了解Java培训机构时,多了解机构Java课程的历史,是不是以Java课程起家,Java培训历史多少年等等。   第二招:课程是否根据企业需求及时更新 要学习,当然是学企业需要的技术,如果一家机构拿出来的课程大纲还是几年前的,那这培养出来的学生怎么找工作,我们都知道,入了IT的门,就得做好随时学习的准备,活到老学到老。如果你是0基础,分辨不出课程的含金量,别慌,打开招聘网站看看企业的招聘要求,看看机构的课程大纲有那些技术没,其次,也可以问身边搞开发的同学,让他们帮忙看看。 第三招:专职的Java培训讲师有几个,老师的从业经验如何 俗话说:师傅带进门

  • 【转】[代码大全读书笔记]如何定义一个好的变量名

    在日常编程中最烦恼的就是给变量取名,一段好代码,既要能完美地运行,还要能较容易地维护。这就意味着需要让日后维护代码的人能很快地看懂你的代码,而且,在团队合作中,其他开发者也会经常阅读你那部分代码。如果你的代码中充满了a,b,c,a1,a2,a3...那简直就是一个噩梦。因此,好的变量名非常重要。 选择好变量名的注意事项 变量和变量名本质上是同一件事物,因此,变量的好与坏就在很大程度上取决于它的命名的好与坏。 下面举一个糟糕命名的例子 $pp=($cp>1)?($cp-1):$cp; $np=($cp<$tp)?($cp+1):$tp; $p=newP($pp,$cp,$np,$tp);复制 这段代码在做什么呢?也许可以大概知道是在计算一些信息,但是,计算的是什么信息呢?$p,$pp,np,$tp等等这些变量代表的是什么呢?讲真,如果没有任何注释,任何人都无法看不懂这段代码想表达的意思。如果写这段代码的人告诉你,这段代码是在计算分页信息,然后实例化一个分页类,那么你应该如何命名呢? 下面是这段代码的另一种写法,看起来更加清晰: $prev_page_num=($curr_

  • shift+alt 可对notepadplusplus 打开的文档进行列操作

    shift+alt可对notepadplusplus打开的文档进行列操作

  • MYSQL8.0新特性

    转载自: https://blog.csdn.net/lkforce/article/details/102940249

  • 如何发现程序中的错误

      假定你的程序编译通过(要当心警告),但运行错误,应该怎么处理呢? 一 你的脑子就是计算机,在脑子中运行并且检查你的程序。直接确定你的错误 二 如果第一步不行。尽可能准备充分的测试数据,让你程序的错误通过运行显现出来。 三 找到让程序出错的输入数据后,如何找到代码的错误之处? 1.把你的脑子当计算机用,运行之 2.使用printf在关键处输出其状态 3.使用编译器提供的调试工具 3.1codeblocks的调试 可以参见 http://blog.csdn.net/sxhelijian/article/details/15026159  要点(1)debug菜单ordebug工具栏     (2)设置断点(F5)     (3)开始调试(F8)     (4)用watches查看变量值(菜单debug/debugwindows/watches)     (5)

  • 使用Go语言实现一个简单的http web服务器

    本文转自https://freeaihub.com/article/make-a-http-server-with-go.html,该页可在线进行运行go服务器 本节将使用go语言中的net/httppackage编写写出一个简洁的HTTP服务器。 net/httpservers中的一个基础概念是处理程序(handlers),处理程序是实现http.Handler接口的对象。编写处理程序的常见方法是http.HandlerFunc在具有适当签名的函数上使用适配器。 充当处理程序的函数采用http.ResponseWriter和http.Request作为参数。响应编写器用于填写HTTP响应。在这里,我们的回应就是“hello\n”。 该处理程序通过读取所有HTTP请求标头并将它们回显到响应主体中,从而使操作更加复杂。 我们使用http.HandleFunc便捷功能在服务器路由上注册处理程序。它在程序包中设置默认路由器,net/http并接受一个函数作为参数。 最后,ListenAndServe使用端口和处理程序进行调用。nil告诉它使用我们刚刚设置的默认路由器。在后台运行服务器,并访问

相关推荐

推荐阅读