Grrenplum本地开发使用

连接我本机:

ssh -p 2222 gpadmin@10.198.61.106 #密码: changeme

执行以下的命令,用于重新构建一遍环境变量

source /usr/local/greenplum-db/greenplum_path.sh

source env.sh

再次执行psql 就可以进入greenplum中去了。

连数据库,我这边好了, 账号: gpadmin, 密码123456, 端口是5433.

gpstart -a => 快速启动|

gpstart -d => 指定数据目录(默认值:$MASTER_DATA_DIRECTORY)

gpstart -q => 在安静模式下运行。命令输出不显示在屏幕,但仍然写入日志文件。

gpstart -R => 管理员连接

gpstart -v => 显示详细启动信息

gpstop -u 重启集群

插入速度过慢的时候:

Greenplum调整的参数如下:

(1)全局死锁检测开关

在Greenplum 6中其默认关闭,需要打开它才可以支持并发更新/删除操作;

gpconfig -c gp_enable_global_deadlock_detector -v on

(2) 禁用GPORCA优化器(据说GPDB6默认的优化器为:GPORCA)

gpconfig -c optimizer -v off

(3)关闭日志

此GUC减少不必要的日志,避免日志输出对I/O性能的干扰。

gpconfig -c log_statement -v none

注意:参数配置修改后,我使用gpstop -u重新加了配置,并用gpconfig -s检查了各个参数确认为修改成功。

导入CSV文件到GreenPlum中去.

copy td_case_custom_column from '/home/gpadmin/td_case_custom_column.csv' with csv;

复制一个文件过去到目录下

scp -P 2222 ~/Downloads/td_case_custom_column.csv gpadmin@10.198.56.186:~

复制一个文件夹过去到/data目录下

scp -P 2222 -r td_case/ gpadmin@10.198.56.186:~/data

使用 copy 命令将 resdata 库下的 aa_test 表中的数据导出到 /tmp/data/test.csv 文件中

---------------------------------------------------------

COPY aa_test TO '/tmp/data/test.csv' WITH csv;

COPY 2

使用 copy 命令将 /tmp/data/test.csv 文件中内容导入到 resdata 库下的 aa_test 表中

---------------------------------------------------------

COPY aa_test FROM '/tmp/data/test.csv' WITH csv;

Greenplum的查询

-- 查看greenplum库各个节点数据的分布情况

select gp_segment_id,count (*) from td_case group by gp_segment_id;

select gp_segment_id,count (*) from td_case where tenant_id ='22' group by gp_segment_id;

-- 查询表的总览

select

relname,

reltuples::int as total

from

pg_class

where

relname = 'td_case'

and relnamespace = (select oid from pg_namespace where nspname = 'public');

-- 查询所有的库

select * from pg_namespace

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Greenplum自动根据create_time创建分区~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

创建分区:

CREATE OR REPLACE FUNCTION auto_insert_into_td_case()

RETURNS trigger AS

BODY

DECLARE

time_column_name text ; -- 父表中用于分区的时间字段的名称[必须首先初始化!!]

curMM varchar(6); -- 'YYYYMM'字串,用做分区子表的后缀

isExist boolean; -- 分区子表,是否已存在

startTime text;

endTime text;

strSQL text;

BEGIN

-- 调用前,必须首先初始化(时间字段名):time_column_name [直接从调用参数中获取!!]

time_column_name := TG_ARGV[0];

-- 判断对应分区表 是否已经存在?

EXECUTE 'SELECT $1.'||time_column_name INTO strSQL USING NEW;

curMM := to_char ( strSQL::timestamp , 'YYYYMM' );

select count (*) INTO isExist from pg_class where relname = (TG_RELNAME||'_'||curMM);

-- 若不存在, 则插入前需 先创建子分区

IF ( isExist = false ) THEN

-- 创建子分区表

startTime := curMM||'01 00:00:00';

endTime := to_char ( startTime::timestamp + interval '1 month', 'YYYY-MM-DD HH24:MI:SS');

strSQL := 'CREATE TABLE IF NOT EXISTS '||TG_RELNAME||'_'||curMM||

' ( CHECK('||time_column_name||'>='''|| startTime ||''' AND '

||time_column_name||'< '''|| endTime ||''' )

) INHERITS ('||TG_RELNAME||') ;' ;

EXECUTE strSQL;

-- 创建索引

strSQL := 'CREATE INDEX '||TG_RELNAME||'_'||curMM||'INDEX'||time_column_name||' ON '

||TG_RELNAME||'_'||curMM||' ('||time_column_name||');' ;

EXECUTE strSQL;

END IF;

-- 插入数据到子分区!

strSQL := 'INSERT INTO '||TG_RELNAME||'_'||curMM||' SELECT $1.*' ;

EXECUTE strSQL USING NEW;

RETURN NULL;

END

BODY

LANGUAGE plpgsql;

CREATE TRIGGER insert_td_case_data_value_trigger

BEFORE INSERT

ON td_case

FOR EACH ROW

EXECUTE PROCEDURE auto_insert_into_td_case('create_time');

但是greenplum不支持上面的自动的创建的过程!!!!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Greenplum的查询~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

--表占用空间

select

relname,

sotdsize / 1024 / 1024 as size_MB,

sotdtoastsize as toast,

sotdadditionalsize as other

from

gp_toolkit.gp_size_of_table_disk as sotd,

pg_class

where

sotd.sotdoid = pg_class.oid

and relname = 'td_case'

order by relname;

--索引占用空间

select

soisize / 1024 / 1024 as size_MB,

relname as indexname

from

pg_class,

gp_toolkit.gp_size_of_index

where

pg_class.oid = gp_size_of_index.soioid

and pg_class.relkind = 'i';

-- 数据库所占用空间

select pg_size_pretty(pg_database_size('testDB'));

-- 一个schema包含的所有表

select * from pg_tables where schemaname = 'public';

-- 查询所有的schema, 以及其id

select oid ,* from pg_namespace;

-- relkind 类型:char

-- 分类:r =普通表,i = 索引,S =序列,v = 视图, c =复合类型,s = 特殊,t =TOAST表

-- 根据上面的id查询索引占用空间, relpages(磁盘用量)

select sum (relpages) from pg_class

where relkind = 'i' and relnamespace = 2200;

-- 根据上面的信息,查询表占用的空间

select sum (relpages) from pg_class

where relkind = 'r' and relnamespace = 2200;

select * from pg_class where

relkind = 'r'

and relnamespace = 2200

and relname like 'td%'

order by relpages desc;

-- 一个表占用的空间的大小

select pg_size_pretty(pg_relation_size('td_case')) ;

--查看seg分布

select

gp_segment_id, count(1)

from td_case group by 1;

-- 磁盘、数据库空间

select * from gp_toolkit.gp_disk_free order by dfsegment;

-- 查询库所占用的空间

select * from gp_toolkit.gp_size_of_database order by sodddatname;

-- 日志查询

select * from gp_toolkit.__gp_log_segment_ext;

GreenPlum + BI Reporting 研究计划

  • 考虑如何实现BI Reporting中的数据需求(数据模型考虑先和已有的case management的数据模型一致)

  • Greenplum中表存储模型的选择(AO、行存、列存等)

选择使用AO的列存,

因为堆表和行存更加适用于OLTP的需求,即查询表的明细数据,很多的更新和删除的场景,

现实的业务场景是:批量的保存数据,然后查询汇总的信息,有更多的分析需求,场景更加偏向于OLAP,所以我们使用AO表的列存。

  • 考虑如何分区的问题(比如按tenant_id、create_time或者update_time等)

根据租户的id分区。

  • 性能测试,尽量模拟真实数据进行测试

  • 数据准备(千万级别准备,数据分布尽量贴近真实,比如有的租户的数据量比较大,比如工作时间内的数据比较集中,非工作时间内的数据量比较少等,这么划分不一定完全准确仅供参考)

  • SQL准备(先考虑几个简单的指标,针对customs field的在简单的数据测试流程跑通之后再进一步考虑)

  • 执行,按照不同的数据分布进行分组测试(考虑在并行的情况下不同sql的执行效率、系统的资源占用情况等)

需求相关

User Cases: https://talkdesk.atlassian.net/wiki/spaces/TSC/pages/2757918779/Reporting+x+freshdesk+Approach

PRD: https://talkdesk.atlassian.net/wiki/spaces/TSC/pages/2742681658/Case+Reports

Greenplum相关参考

Greenplum表存储模型选择 - 程序员大本营

Greenplum性能优化之路 --(二)存储格式-腾讯云开发者社区-腾讯云

https://www.cnblogs.com/xibuhaohao/p/11127556.html

相关推荐
pk_xz12345630 分钟前
Shell 脚本中变量和字符串的入门介绍
linux·运维·服务器
小珑也要变强33 分钟前
Linux之sed命令详解
linux·运维·服务器
海绵波波10739 分钟前
Webserver(4.3)TCP通信实现
服务器·网络·tcp/ip
九河云3 小时前
AWS账号注册费用详解:新用户是否需要付费?
服务器·云计算·aws
Lary_Rock3 小时前
RK3576 LINUX RKNN SDK 测试
linux·运维·服务器
幺零九零零3 小时前
【计算机网络】TCP协议面试常考(一)
服务器·tcp/ip·计算机网络
云飞云共享云桌面5 小时前
8位机械工程师如何共享一台图形工作站算力?
linux·服务器·网络
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
一坨阿亮6 小时前
Linux 使用中的问题
linux·运维
dsywws7 小时前
Linux学习笔记之vim入门
linux·笔记·学习