连接我本机:
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相关参考