从oracle往greenplum迁移,查询性能不满足要求的定位以及调优过程
一、前言
在一次对比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迁移,查询性能不满足要求的定位以及调优过程的更多相关文章
- 一个简单web系统的接口性能分析及调优过程
在测试一个简单系统接口性能压力时,压到一定数量,程序总是崩溃,查看相关机器相关数据时,CPU.内存.IO占用均不高,问题自然出现在其它地方先介绍下系统部件架构 Resin版本为:[root@local ...
- Linux性能优化从入门到实战:13 内存篇:内存指标/工具总结、问题定位和调优
内存性能指标 系统内存指标 已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存. 共享内存是通过 tmpfs 实现的,所以它的大小也就是 tmpfs 使用的内存大小.tmpfs 其实也是一种特 ...
- 数据库调优过程(一):SqlServer批量复制(bcp)[C#SqlBulkCopy]性能极低问题
背景 最近一段给xx做项目,这边最头疼的事情就是数据库入库瓶颈问题. 环境 服务器环境:虚拟机,分配32CPU,磁盘1.4T,4T,5T,6T几台服务器不等同(转速都是7200r),内存64G. 排查 ...
- 【性能调优】:记录一次数据库sql语句性能调优过程
一,依旧很简单的一个接口,查询列表接口,发现10并发单交易场景下,数据库表4w铺底数据,每次查询2000条数据进行orderby显示,平均响应时间2秒以上,数据库的cpu使用率高达95%: 二,抓到这 ...
- Linux性能优化从入门到实战:16 文件系统篇:总结磁盘I/O指标/工具、问题定位和调优
(1)磁盘 I/O 性能指标 文件系统和磁盘 I/O 指标对应的工具 文件系统和磁盘 I/O 工具对应的指标 (2)磁盘 I/O 问题定位分析思路 (3)I/O 性能优化思路 Step 1:首先采用 ...
- 【性能优化】(2)JVM调优
JVM调优 2019-07-21 12:32:00 by冲冲 1.
- 一个InnoDB性能超过Oracle的调优Case
年前抽空到兄弟公司支援了一下Oracle迁移MySQL的测试,本想把MySQL调优到接近Oracle的性能即可,但经过 @何_登成 @淘宝丁奇 @淘宝褚霸 @淘伯松 诸位大牛的指导和帮助(排名不分先后 ...
- [转]oracle性能调优之--Oracle 10g AWR 配置
一.ASH和AWR的故事 1.1 关于ASH 我们都知道,用户在ORACLE数据库中执行操作时,必然要创建相应的连接和会话,其中,所有当前的会话信息都保存在动态性能视图V$SESSION中,通过该视图 ...
- Informatica_(6)性能调优
六.实战汇总31.powercenter 字符集 了解源或者目标数据库的字符集,并在Powercenter服务器上设置相关的环境变量或者完成相关的设置,不同的数据库有不同的设置方法: 多数字符集的问题 ...
随机推荐
- What’s the difference between a stack and a heap?
http://www.programmerinterview.com/index.php/data-structures/difference-between-stack-and-heap/ The ...
- 获取所有权windows目录所有权
Takeown /r /f 盘符:\目录\目录 例如: Takeown /r /f C:\Windows\CSC
- 设置C++ cout输出精度
cout.precision(5); 数字表示小数点位数 // modify precision #include <iostream> // std::cout, std::ios in ...
- python csv写入数据,消除空行
import csv rowlist=[{'first_name': 'mark', 'last_name': 'zhao','age':21}, {'first_name': 'tony', 'la ...
- [EffectiveC++]item36:绝不重新定义继承而来的non-virtual函数
- Docker技术三大要点:cgroup, namespace和unionFS的理解
www.docker.com的网页有这样一张有意思的动画: 从这张gif图片,我们不难看出Docker网站想传达这样一条信息, 使用Docker加速了build,ship和run的过程. Docker ...
- C# using、namespace使用注意事项
一.using 用法 1.引用命名空间. 如: using System; 2.自动释放对象使用的资源. 如: using (SqlConnection connection = new SqlCon ...
- Libevent源码学习笔记一:event2/event.h
一.libevent标准使用方法: 每个程序使用Libevent必须include <event2/event.h> 头文件,并 传给 -levent 链接器.如果只是想使用主要的eve ...
- 51Nod - 1205 (流水先调度)超级经典的贪心 模板题
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1205 N个作业{1,2,…,n}要在由2台机器M1和M2组成 ...
- git详细使用教程入门到精通(史上最全的git教程)
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不 需要联网了,因为版本都是在自己的电脑上.既然每个人的电脑都有一个完整的版本库,那多个人如何 ...