一、前言

在一次对比oracle和greenplum查询性能过程中,由于greenplum查询性能不理想,因此进行定位分析,提升greenplum的查询性能

二、环境信息

初始情况下,搭建一个小的集群,进行性能测试

磁盘 SAS
交换机 千兆
集群大小 4segment
数据量 3亿
数据文件大小 68G
表类型 Heap 行表
字段类型 所有列为varchar
列宽 41列
索引
查询语句 select count(*) from xxx where gjdqdm = 'CHN' and crrqsj >= '20100101000000' and crrqsj <= '20180101000000' and crkadm = '055'

PS:由于要求greenplum中的表数据类型和源表类型一直,且索引一致。所以所有字段都为varchar类型且无索引,因此这方面没有优化空间。

三、优化过程

3.1 结果对比

SQL ORACLE耗时 greenplum耗时
select count(*) from xxx where gjdqdm = 'CHN' and crrqsj >= '20100101000000' and crrqsj <= '20180101000000' and crkadm = '055' 24S 14.1S

14.1S是不能接受的速度,因此需要查找原因,以期找出性能瓶颈,提供优化方案

3.2 分析过程

3.2.1 查看执行计划

从①处可以看出,所有的耗时都在③的操作,seq scan上。

这里①处的意思是(摘自官网):

The numbers that are quoted by EXPLAIN are (left to right):

    Estimated start-up cost (time expended before the output scan can start, e.g., time to do the sorting in a sort node)

    Estimated total cost (if all rows are retrieved, though they might not be; e.g., a query with a LIMIT clause will stop short of paying the total cost of the Limit plan node's input node)

    Estimated number of rows output by this plan node (again, only if executed to completion)

    Estimated average width (in bytes) of rows output by this plan node

③处的意思是:顺序扫描磁盘

从②处可以看出,所有的segment都参与了查询

从④处可以看出,所有的列设置为varchar都进行了类型转换,转成了text,且没有走索引(也无索引能用)

从⑤出可以看出,实际使用的内存远小于分配的内容,所以这里可以判断出问题不在内存

3.2.2 查看数据分布情况

这里可以看到数据分布是非常均匀的,所以不存在其中一台计算节点耗时特别长的情况

3.2.3 查看CPU情况

既然内存没有问题,那就可以尝试看CPU和磁盘的使用情况了

在其中计算节点使用top命令查看:

这里是其中一台计算节点的截图,这里说明仅仅对于这一条SQL而言,已经消耗了CPU100%的资源,但是整机还有相当富余的CPU资源可用

3.2.4 查看磁盘情况

使用sar命令查看计算节点情况

PS:这里仅展示一套机器(实际情况中每一台计算节点都是相同的情况)

这里发现iowait一列是基本都为0,但是idle也为0,此处验证了磁盘io没有问题,问题出在CPU上

3.3 问题解决

前面说到这个greenplum集群建立的时候只在每台结算节点分配了一个segment,所以每台机器上只有一个CPU是忙碌状态的,而其他的CPU处于空闲状态

充分的利用CPU资源,就可以显著提高查询的性能。

因此,对这套集群的segment进行扩容,将原来的4个segment扩容为54个,并且重新建表后将所有varchar类型换成text,将参与查询的日期列设置为分区键,分布键不变,仍为id列

3.4 最终结果

oracle 原集群 扩容后的集群
24S 14.1S 1.5S

四、参考资料

https://www.postgresql.org/docs/9.2/static/using-explain.html

从oracle往greenplum迁移,查询性能不满足要求的定位以及调优过程的更多相关文章

  1. 一个简单web系统的接口性能分析及调优过程

    在测试一个简单系统接口性能压力时,压到一定数量,程序总是崩溃,查看相关机器相关数据时,CPU.内存.IO占用均不高,问题自然出现在其它地方先介绍下系统部件架构 Resin版本为:[root@local ...

  2. Linux性能优化从入门到实战:13 内存篇:内存指标/工具总结、问题定位和调优

    内存性能指标 系统内存指标 已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存. 共享内存是通过 tmpfs 实现的,所以它的大小也就是 tmpfs 使用的内存大小.tmpfs 其实也是一种特 ...

  3. 数据库调优过程(一):SqlServer批量复制(bcp)[C#SqlBulkCopy]性能极低问题

    背景 最近一段给xx做项目,这边最头疼的事情就是数据库入库瓶颈问题. 环境 服务器环境:虚拟机,分配32CPU,磁盘1.4T,4T,5T,6T几台服务器不等同(转速都是7200r),内存64G. 排查 ...

  4. 【性能调优】:记录一次数据库sql语句性能调优过程

    一,依旧很简单的一个接口,查询列表接口,发现10并发单交易场景下,数据库表4w铺底数据,每次查询2000条数据进行orderby显示,平均响应时间2秒以上,数据库的cpu使用率高达95%: 二,抓到这 ...

  5. Linux性能优化从入门到实战:16 文件系统篇:总结磁盘I/O指标/工具、问题定位和调优

    (1)磁盘 I/O 性能指标 文件系统和磁盘 I/O 指标对应的工具 文件系统和磁盘 I/O 工具对应的指标 (2)磁盘 I/O 问题定位分析思路 (3)I/O 性能优化思路 Step 1:首先采用 ...

  6. 【性能优化】(2)JVM调优

    JVM调优 2019-07-21  12:32:00  by冲冲 1.

  7. 一个InnoDB性能超过Oracle的调优Case

    年前抽空到兄弟公司支援了一下Oracle迁移MySQL的测试,本想把MySQL调优到接近Oracle的性能即可,但经过 @何_登成 @淘宝丁奇 @淘宝褚霸 @淘伯松 诸位大牛的指导和帮助(排名不分先后 ...

  8. [转]oracle性能调优之--Oracle 10g AWR 配置

    一.ASH和AWR的故事 1.1 关于ASH 我们都知道,用户在ORACLE数据库中执行操作时,必然要创建相应的连接和会话,其中,所有当前的会话信息都保存在动态性能视图V$SESSION中,通过该视图 ...

  9. Informatica_(6)性能调优

    六.实战汇总31.powercenter 字符集 了解源或者目标数据库的字符集,并在Powercenter服务器上设置相关的环境变量或者完成相关的设置,不同的数据库有不同的设置方法: 多数字符集的问题 ...

随机推荐

  1. 从SuperSocket的App.config中读取配置,并修改保存,再重启服务

    string XmlPath = System.Windows.Forms.Application.ExecutablePath + ".config"; XmlDocument ...

  2. VSTO 开发中 应用ActionPane、CustomTaskPane

    以Excel插件为例: 1. ActionPane 创建 ThisWorkbook 项目 private void ThisWorkbook_Startup(object sender, System ...

  3. windows10 如何关闭快速关机功能电源选项

    点击右下角的电池 -> power and sleep setting -> choose what the power buttons do -> change settings ...

  4. springmvc使用map接收form表单的参数

    其实只需要在map前面加上@RequestParam参数即可,jsp的name等都不变 public String queryByCondition(@RequestParam Map<Stri ...

  5. Codeforces Round #533 (Div. 2) B. Zuhair and Strings 【模拟】

    传送门:http://codeforces.com/contest/1105/problem/B B. Zuhair and Strings time limit per test 1 second ...

  6. Linux学习总结(九)-源码包和rpm包安装

    一.源码包安装 通常办法是安装三部曲:./configuremakemake install但是具体还要根据包里面的帮助文档操作./configure --help 可以查看可以带什么参数,比如--p ...

  7. 关于Ftp服务器

    步骤/方法 首先在本地机器上创建一个用户!这些用户是用来登录到FTP的!我的电脑右键->管理->本地用户和组->用户->“右键”新建用户->输入用户名和密码再点创建就行了 ...

  8. PAT——1008. 数组元素循环右移问题

    一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… AN-1 A0  ...

  9. IOS9中使用NSURLConection发送异步网络请求

    IOS9中使用NSURLConection发送异步网络请求 在ios9中,NSURLConection的sendSync..和sendAsync已经过时.被NSURLSession代替. 以下蓝色部分 ...

  10. SQLserver高级编程

    1.数据库设计 数据库设计的重要性: 减少冗余,提高性能.易维护 数据库设计的步骤: 1.收集信息.标识对象.标识属性.标识关系(一对一.一对多.多对一.多对多) E-R图: 属性:定义实体的性质.实 ...