Gauss(DWS)“表信息查询”与“分布列等信息修改”的一个方便脚本

举报
SeqList 发表于 2020/09/07 18:13:38 2020/09/07
【摘要】 最近开始接触GaussDB(DWS),在查询一些表信息的时候,总是忘记字典表是啥,虽然说用的多就记住了,但是还没记住的时候,总是要查询产品文档或之前的笔记,挺麻烦的。同时比如优化SQL的时候,总会需要综合多方面的信息,就需要多个字典表,比如表的分布列,分布方式,空间大小,倾斜率,有没收集统计信息等等,还需要统计一起,那就需要更多工作了。决定写一个shell脚本来减轻工作量。

最近开始接触GaussDB(DWS),在查询一些表信息的时候,总是忘记字典表是啥,虽然说用的多就记住了,但是还没记住的时候,总是要查询产品文档或之前的笔记,挺麻烦的。同时比如优化SQL的时候,总会需要综合多方面的信息,就需要多个字典表,比如表的分布列,分布方式,空间大小,倾斜率,有没收集统计信息等等,还需要统计一起,那就需要更多工作了。

经过几次需要的统计表信息的SQL优化后,决定写一个shell脚本,将需要的信息一次性查询出来。同时还能支持我修改分布列和分布方式,这样我就能快速优化SQL。脚本在附件中,下面介绍一下常用的功能:


一、表分布列等信息

使用MPP数据库,在写SQL的时候,总是需要知道表的基本信息的,比如知道分布列是什么,才能写出好SQL。下面功能展示的是我能够写出好SQL所需要的一些表信息:

使用附件脚本gtool.sh,在gsql、gs_dump等GaussDB(DWS)客户端就绪的服务器下(后续默认在这样的环境下),执行以下命令

./gtool.sh Q 1 d=tpch s=public

其中参数Q 为查询;1为第一个查询内容,即表的信息;d=tpch为指定库名称,s=public为指定schema名称。后续还能table的名称,hostip,用户,密码等。

查询出来结果如下:

image.png

这里面主要的信息有以下几个:

  1. 表分布列(distributekey),有值的就是hash的,没有值的就是REPLICATION复制表

  2. 分布方式(reloptions),列存行存(column/row),以及压缩等级(low,middle,high,no)

  3. 空间大小(size_gb),表多大,按GB

  4. 表倾斜率(skew_per),表倾斜率,此处按照本人习惯计算,倾斜率=(1-(avg/max ))*100 ,100代表数据都在一个DN上了,最倾斜的情况,越接近100越倾斜。

  5. 表创建和修改时间(ctime、mtime)

  6. 最近一次收集统计信息时间(last_analyze_time),空则代表没有收集统计信息。


[ INFO ]里面有执行的SQL脚本/tmp/gtool1.sql,如果需要修改sql来执行可以修改该sql文件。然后通过命令行执行。


二、修改表分布列

修改分布列是非常常用的SQL优化手段,一般情况下我们建表会指定分布列,但是没有指定分布列的话,系统会默认选择第一列作为分布列。那类似的原因会导致分布倾斜,关联倾斜的情况发生,这时候就需要修改分布列了。

使用gtool.sh脚本可以轻松修改分布列。

在命令行中输入./gtool.sh,会列举一些案例,其中参数M 1为修改分布列

image.png

我们可以看到划线的例子中

./gtool.sh M 1 d=tpch t=region c=r_regionkey

第一个是修改region的分布方式为REPLICATION,即将其复制到每个DN上,同时没有runnow=1参数,这里只会帮你生成SQL,并不会执行。

image.png

./gtool.sh M 1 d=tpch t=region c=r_name runnow=1

第二个是修改region的分布列为r_name,并且有runnow=1,就会立即执行,结果如下

image.png

可以看到每一步的SQL都有打印在[ EXAMPLE ] 中,执行完毕后前后比对可以看出分布列已经变化。


三、修改分布方式(行存转列存或列存转行存)

GaussDB(DWS)的行列存有不同的适用场景,在使用时可能需要转换一下,如果手工转换的话,可能会漏掉一些信息,比如索引,统计信息等。此处脚本会先看原来的表有无索引的信息,然后转换以后重新建索引,已达到不丢失索引等目标。但是需要注意的是一些列存不支持的内容在转换过程中会被删除,比如列存不支持PK等。本脚本没有适用所有场景,如有报错还需要修改一下输出的脚本再重新执行一下。

在命令行中输入./gtool.sh,会列举一些案例,其中参数M 2为修改分布方式,行存变列存或者列存变行存。

image.png

第一个例子与第二个例子对比,多了一个runnow=1和rep=0,这两个选择分别代表是否执行以及是否替换原来的表。rep=1代表替代原来的表,会先将原来的rename掉,然后在建一个新的表。而rep=0或者不输入rep= 则为不替换原来的表。

第一个例子

./gtool.sh M 2 d=tpch t=region

image.png

生成的脚本内容如下

image.png


第二个例子,此处修改rep=1,即会替换原来的表。并预先建了一个cbtree索引给region表

./gtool.sh M 2 d=tpch t=region  runnow=1 rep=1

image.png

脚本内容如下,可以看到首先会rename原来的表,原来的cbtree会改成了行存的btree索引

image.png


总结

以上是本人总结写的一个方便脚本常用的一些命令以及说明,其他的功能可以通过./gtool.sh h  这个help命令查看,或者直接打开shell查看里面的内容。有需要改进的地方可以在本文出一起修改探讨,谢谢阅读!

    附件下载

  • gtool.zip 6.39KB 下载次数:56
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。