greenplum属于分布式的数据库,MPP+Share nothing的体系,查询的效率很快.不过,这是建立在数据分散均匀的基础上的.如果DK值设置不合理的话,完全有可能出现所有数据落在单个节点上的情况,这就体现不出优势来.因此,DK值的设置是否合适是建表的时候,需要考虑的重要因素之一.

查看表(table_name)的数据在节点的分布情况:

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

  如果数据有严重倾斜的话,即某些节点的数据量过大,表示DK值需要重新调整.调整语句为alter table table_name set distirbuted by(col1,col2,...);

现在有个问题是:如何发现哪些DK值设置不合理的表呢?可以参照之前写的文章:数据分布查看,执果索因调整

这里介绍的是如何把DK值展现出现,一般设置单列(该列为日期类型,每天一份的话)的表,就很有可能出现DK值不合理的情况。我们需要利用到三张表:

pg_class       --object属性表,relkind表示object属性,'r'代表table

pg_attribute  --展现详细的列

gp_distribution_policy  --存储DK值

首先,创建一个类型,用来显示function的结果集.

create type dk_table_type as
(
table_name varchar,
dk_cols varchar
);

然后,用上面三张表组合起来,得到相应的所需要的结果信息.

CREATE OR REPLACE FUNCTION get_table_dk()
RETURNS SETOF dk_table_type AS
$BODY$
DECLARE
v_cur_tb cursor for
select d.nspname||'.'||a.relname,b.attname
from
pg_class a
inner join
pg_attribute b
on a.oid=b.attrelid
inner join
gp_distribution_policy c
on a.oid=c.localoid
inner join pg_namespace d
on a.relnamespace=d.oid
where a.relkind='r' and b.attnum=any(c.attrnums)
order by d.nspname||'.'||a.relname,b.attname,b.attnum;
v_tb varchar(500):='';
v_tb_new varchar(500):='';
v_dk_col varchar(100):='';
v_dk_cols varchar(1000):='';
v_record dk_table_type;
BEGIN
open v_cur_tb;
loop
fetch v_cur_tb into v_tb_new,v_dk_col;
if not found THEN
exit;
end if;
if v_tb = '' and v_dk_cols = '' then
v_tb := v_tb_new;
v_dk_cols:=v_dk_col;
ELSEIF v_tb <> v_tb_new THEN
select v_tb,v_dk_cols into v_record;
return next v_record;
v_tb := v_tb_new;
v_dk_cols:=v_dk_col;
ELSE
v_dk_cols:=v_dk_cols||','||v_dk_col;
end if;
end loop;
select v_tb,v_dk_cols into v_record;
return next v_record;
close v_cur_tb;
end;
$BODY$
LANGUAGE plpgsql VOLATILE;

  然后,执行select * from get_table_dk()就可以获得表以及其对应的DK值(列),从而可以直观的发现是否有些表需要调整,此时就用上面的gp_segment_id来验证.如果是的话,就进行相应的调整.

greenplum表的distributed key值查看的更多相关文章

  1. linux下C++ STL hash_map的使用以及使用char *型变量作为Key值的一大“坑”

    计算机编程中经常会用到hash表,而在C++中,使用STL编程更是少不了的.本文将介绍STL中hash_map的使用.在hash_map中使用自定义类型作为key值的方法以及在使用char *类型作为 ...

  2. 数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

    题目描述 数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个数然后输入成对的index和value值 ...

  3. OVS 内核KEY值提取及匹配流表代码分析

    原文链接:http://ry0117.com/2016/12/24/OVS内核KEY值提取及匹配流表代码分析/ 当开启OVS后,创建datapath类型为system的网桥并他添加相关接口,OVS网桥 ...

  4. Cassandra二级索引原理——新创建了一张表格,同时将原始表格之中的索引字段作为新索引表的Primary Key,并且存储的值为原始数据的Primary Key,然后再通过pk一级索引找到真正的值

    1.什么是二级索引? 我们前面已经介绍过Cassandra之中有各种Key,比如Primary Key, Cluster Key 等等.如果您对这部分概念并不熟悉,可以参考之前的文章: [Cassan ...

  5. 数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出

    此题如果直接使用有序的TreeMap就不需要这样折腾: 1.map的key值唯一性,故就不在需要set集合来去重 2.使用map后利用key的唯一性,把序列号相同的数据直接加在一起,代码会很简洁 pa ...

  6. Greenplum 表空间和filespace的用法

    转载:https://yq.aliyun.com/articles/190 Greenplum支持表空间,创建表空间时,需要指定filespace.postgres=# \h create table ...

  7. SQL Server表分区的NULL值问题

    SQL Server表分区的NULL值问题 SQL Server表分区只支持range分区这一种类型,但是本人觉得已经够用了 虽然MySQL支持四种分区类型:RANGE分区.LIST分区.HASH分区 ...

  8. EF Core中,通过实体类向SQL Server数据库表中插入数据后,实体对象是如何得到数据库表中的默认值的

    我们使用EF Core的实体类向SQL Server数据库表中插入数据后,如果数据库表中有自增列或默认值列,那么EF Core的实体对象也会返回插入到数据库表中的默认值. 下面我们通过例子来展示,EF ...

  9. 删除带外键的表【foreign key constraint fails】报错

    title: 删除带外键的表[foreign key constraint fails]报错 date: 2018-08-02 21:59:06 tags: 数据库 --- 遥想当时正在学hibern ...

随机推荐

  1. WINAPI和APIENTRY是一样的

    今天写线程函数时,发现msdn中对ThreadProc的定义有要求:DWORD WINAPI ThreadProc(LPVOID lpParameter); 不解为什么要用WINAPI宏定义,查了后发 ...

  2. Javascript基础编程の面向对象编程

    javascript是解释型的语言,在编译时和运行时之间没有明显区别,因此需要更动态的方法.javascript没有正式的类的概念,我们可以使用在运行时创建新的对象类型来替代,并且可以随时更改已有对象 ...

  3. 直接通过Response输出流写文件,浏览器表现为下载文件

    response.setContentType("application/x-download"); response.addHeader("Content-Dispos ...

  4. oracle数据库中修改已存在数据的字段

    在oracle中,如果已经存在的数据的某些列,假如要更换类型的话,有的时候是比较麻烦的, 会出现:ORA-01439: column to be modified must be empty to c ...

  5. 玩转车联网1---初识OBD和行车助手

    题目取得有点大,不免有博取眼球之嫌.车联网作为物联网的一个分支,预计在2015年市场会达到1500亿,特斯拉股票balabala,谷歌无人驾驶, 当然,我们是技术类博客,得找个能够快速上手,快速落地的 ...

  6. ASP.NET MVC 缓存页面(方法)

  7. 关于C#/sqlserver生成32位数据库字段总结

    一.C#中用Guid.NewGuid().ToString() Sql中用NEWID()   以上方法生成的是36位的GUID,如果需要转换成32位,则需要替换掉其中的'-'字符. Sql中的方法:r ...

  8. python学习之路 四 :文件处理

    本节重点 掌握文件的读.写.修改方法 掌握文件的处理模式的区别 一.文件读取 ​    ​1.读取全部内容 # 一次性读取文件 f = open("test.txt",'r',en ...

  9. 201621123012 《Java程序设计》第9周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 2. 书面作业 本次作业题集集合 1. List中指定元素的删除(题集 ...

  10. vc6.0 Buile菜单下 Profile的作用

    Profile的作用 帮助你分析并发现程序运行的瓶颈,找到耗时所在,同时也能帮助你发现不会被执行的代码.从而最终实现程序的优化. Profile的组成 Profile包括3个命令行工具:PREP,PR ...