GreenPlum之日常SQL脚本笔记(二)

来源:互联网 发布:淘宝指数官网下载 编辑:程序博客网 时间:2024/06/05 16:31

1.查看数据库中大于100MB的表的倾斜情况

(数据倾斜率公式:最大子节点数据量/平均节点数据量。为避免整张表的数据量为空,同时对结果的影响很小,在平均节点数据量基础上加上一个很小的值)

SELECT table_name,max_div_avg,pg_size_pretty(total_size) table_size FROM (SELECT table_name,MAX(size)/(AVG(size)+0.001) AS max_div_avg,CAST(SUM(size) AS BIGINT) total_sizeFROM(SELECT gp_segment_id,oid::regclass table_name,pg_relation_size(oid) sizeFROM gp_dist_random('pg_class')WHERE relkind='r'AND relstorage IN ('a','h')) tGROUP BY table_name)tab WHERE total_size >= 104857600ORDER BY total_size DESC;

2.队列限制,执行和等待查询的数量:

select * from pg_resqueue_status 

3.查看role分配的resource queue

SELECT rolname, rsqname FROM pg_roles, pg_resqueue WHERE pg_roles.rolresqueue=pg_resqueue.oid;

4.查询所有的resource queue的当前活动sql 

 SELECT usename, rsqname, locktype, objid, transaction, pid, mode, granted, waiting FROM pg_stat_activity, pg_resqueue, pg_locks WHERE pg_stat_activity.procpid=pg_locks.pid AND pg_locks.objid=pg_resqueue.oid;

5.各主、镜像节点存放的文件系统路径

select * from pg_filespace_entry;

6.查看数据库空间大小

SELECT *,pg_size_pretty(sodddatsize) dbsize FROM gp_toolkit.gp_size_of_database ORDER BY sodddatsize desc;

7.查看活动语句的优先级

select *from gp_toolkit.gp_resq_priority_statement;
8.查看锁信息
SELECT locktype, database, c.relname, l.relation, l.transactionid, l.transaction, l.pid, l.mode, l.granted, a.current_query FROM pg_locks l, pg_class c, pg_stat_activity a WHERE l.relation=c.oid AND l.pid=a.procpid ORDER BY c.relname; 

9.修改某个数据库为只读状态(要求管理员权限)

alter database mp_mvt set default_transaction_read_only= on ;

10.查看哪些节点挂了

select *from gp_segment_configuration where status = 'd';

11.当前数据库使用状态

select * from pg_stat_database;

12.查看GP对应的PostgreSQL版本信息

SELECT VERSION();


/*部分GP优化总结:not in==》改用left join去重后的表关联来实现cost:返回第一行记录前的启动时间,和返回所有记录的总时间(以磁盘页面存取为单位计量)rows:根据统计信息估计SQL返回结果集的行数width:返回的结果集的每一行的长度,这个长度值是根据pg_statistic表中的统计信息来计算的hash join: 先对其中一张关联的表计算hash值,在内存中用一个散列表保存,然后对另外一张表进行全表扫描,之后将每一行与这个散列表进行关联。nestedloop:关联的两张表中的数据量比较小的表进行广播,如笛卡尔积:select * fromtest1,test2merge join:将两张表按照关联键进行排序,然后按照归并排序的方式将数据进行关联,效率比hash join差。full outer join只能采用merge join来实现。哈希关联 - 用关联字段做哈希键,对小表建立哈希表。然后扫描大表,计算大表每行关联字段的哈希键,从哈希表中查找哈希值相同的行。通常哈希关联是速度最快的关联方式。解释计划中的Hash Cond是关联字段。嵌套循环 - 遍历大数据集,对其每一行,扫描小数据集,并找到匹配的行。嵌套循环关联需要广播一个表的数据,以便另一个表的数据可以和该表的每一行进行比较。对于小表或者使用索引的表性能良好。也用于笛卡尔关联和范围关联。对大表使用嵌套关联性能不佳。如果查询节点使用嵌套循环关联操作符,则检查SQL,确保结果是期望的。设置配置参数enable_nestloop 为 OFF (默认)以优先使用哈希关联。合并关联 - 对两个数据集排序,然后合并。合并关联对已经排序的数据性能很好,但是较少使用。如要使用合并关联,设置 enable_mergejoin 为 ON。关联键强制类型转换 一般,表按照指定的分布键作hash分部。如果两个表按照id:intege、id:numericr分布,关联时,需要有一个表id作强制类型转化,因为不同类型的hash值不一样,因而导致数据重分布。关联键与分部键不一致group by、开窗函数、grouping sets会引发重分布1、批量数据处理后,无论成功与否,都应该进行vaccumanalyze <table_name>. 2、对于大表的DISTINCT操作,请用 GROUPBY操作进行替代 3、对于大表的UNION操作,请用UNIONALL 加 group by进行改写 4、嵌套查询操作,尽量改写成连接查询操作 5、大表更新操作,尽量通过外连接+插入+truncate进行替代 6、大表删除操作,尽量通过外连接+插入+truncate进行替代 7、尽量避免进行存储过程函数嵌套导致锁冲突,考虑使用其它语言进行总体调度,比如shell,Java,c等。 8、尽量避免在数据库中使用序列,游标, 循环,考虑对数据进行整体操作。 9、避免高度频繁的建表删表操作,容易造成字典破碎和字典锁的问题,因此可以通过临时表和其它语言方式替代。 11、检查大表的hash键定义是否可以保证每个segment存储均匀,数据处理均匀,以及大表连接操作过程中可以尽量避免motion操作。从目前业务看,可以考虑客户ID, 电话号码作为首选的hash键,然后进行检查。 12、为了加快开发进度,减少开发时的彼此影响,建议每个开发人员装一个gp虚拟机,相关表放入少量记录,进行单步测试。通过单步测试后,统一提交到测试服务器上进行联合测试和压力测试。 13、运行较大操作时,不建议使用pgadmin完成操作,建议写成shell脚本在后台进行测试。避免频繁不正常中断操作,对整个开发产生影响 14、尽量避免不正常中断操作,如需不正常中断操作,请使用函数pg_cancel_backend函数,并耐心等待3~5分钟,再继续相关操作,避免造成数据字典破坏。聚合函数太多:一条SQL中聚合函数太多,而且可能由于统计信息不够详细或者SQL太负责,错选hashaggregate来执行,导致内存不足。解决方法:拆分成多个SQL来执行,减少hashaggregate使用的内存执行enable_hashagg=off,把hashaggregate参数关掉,强制不采用。将会采用groupaggregate,这样排序时间会长一些,但是内存可控,建议采用这种方式比较简单。资源队列:数据写入、查询分别使用不同的用户,GP创建用户时为不同用户指定不同的资源队列。其它优化技巧:用group by对distinct改写,因为DISTINCT要进行排序操作用UNION ALL加GROUP BY的方式对UNION改写尽量使用GREENPLUM自身提供的聚合函数和窗口函数去完成一些复杂的分析*/