DWS优秀实践之数据库性能提升
1.1 冗余会话清理
现场通常使用Data Studio进行DWS数据库连接,很多人使用关闭后不关闭窗口,导致数据库连接仍然存在,后台大量堆积Data Studio查询作业,导致DWS集群查询无响应。可以参照以下超长会话清理方式进行操作。
注意:该清理操作,需要在每个CN上都执行。
-- 查询持续运行时间超过一天的会话 SELECT * FROM PG_STAT_ACTIVITY WHERE useName <> 'Ruby' and state <> 'idle' and current_timestamp - query_start > interval '1 days'; --杀掉会话 SELECT PG_TERMINATE_BACKEND(pid) FROM PG_STAT_ACTIVITY WHERE useName <> 'Ruby' and state <> 'idle' and current_timestamp - query_start > interval '1 days'; |
Ø 实践建议:建议运维人员定时执行该操作,及时清理垃圾会话,避免不佳使用习惯对数据库造成影响。
1.2 磁盘垃圾回收
在对表做了大量更新和删除之后,会产生表的膨胀现象,导致全表扫描性能劣化非常严重。在现场发现,垃圾数据多了,会导致全表扫描IO量达到正常值200倍以上,并且select * from {tableName} limit 100; 这样的简单查询,也会受到影响。
可以通过如下语句查询数据库内部表的脏页情况,如果发现脏页dirty_page_rate非常高,超过30,建议及时进行VACUUM FULL。
SELECT * FROM PGXC_GET_STAT_ALL_TABLES WHERE schemaName NOT IN('pg_toast', 'pg_catalog', 'information_schema', 'cstore','pmk') ORDER BY dirty_page_rate DESC; |
注意:VACUUM FULL会导致当前表进入只读,所以需要选择合适时间执行。
VACUUM FULL ANALYZE {tableName}; |
Ø 实践建议:建议定期对整库进行VACUUM,个别垃圾数据比较频繁的表,可以频率更加频繁一些。
1.3 分布键调整
当前很多使用场景中建表没有指定分布键,系统默认使用表中的第一列作为分布键,这不仅导致数据倾斜严重,极端情况下,数据可能全部只分布在一个DN中,严重影响查询效率。数据倾斜检查办法如下:
SELECT * FROM PGXC_GET_TABLE_SKEWNESS ORDER BY SKEWRATIO DESC; |
PGXC_GET_TABLE_SKEWNESS视图字段信息如下:
名称 |
类型 |
描述 |
schemaname |
name |
表所在的模式名。 |
tablename |
name |
表名。 |
totalsize |
numeric |
表的总大小,单位Byte。 |
avgsize |
numeric(1000,0) |
表大小平均值(totalsize/DN个数,该值为平均分布的理想情况下,表在各DN占用空间大小)。 |
maxratio |
numeric(4,3) |
单DN表大小最大值占比(表在各DN占用空间的最大值/totalsize)。 |
minratio |
numeric(4,3) |
单DN表大小最小值占比(表在各DN占用空间的最小值/totalsize)。 |
skewsize |
bigint |
表分布倾斜值(单DN表大小最大值 - 单DN表大小最小值)。 |
skewratio |
numeric(4,3) |
表分布倾斜率(skewsize/totalsize)。 |
skewstddev |
numeric(1000,0) |
表分布标准方差(在表大小一定的情况下,该值越大表明表的整体分布情况越倾斜)。 |
如果发现数据倾斜,或者在查询过程中,执行计划不合理,产生大量数据重分布,整改操作步骤如下:
1. 创建新表,重新指定分布键,导入数据到新表中
2. 修改原始表名称,并修改新表为正式表名称,然后删除原始旧表。
3. 对新表执行ANALYZE。
Ø 实践建议:建议对数据库内部所有表进行倾斜检查,调整分布键。
- 点赞
- 收藏
- 关注作者
评论(0)