Greenplum查询相关优化

Greenplum 查询相关优化

管理查询生成的溢出文件

错误1. ERROR: number of workfiles per query limit exceeded

可能导致文件溢出过多的原因包括:

  1. 被查询的数据中倾斜太严重
  2. 为该查询分配的内存量太小

如果为SQL查询分配的内存不足,Greenplum数据库会创建溢出文件(也叫工作文件)。在默认情况下,一个SQL查询最多可以创建 100000 个溢出文件,这足以满足大多数查询。
在尝试增大gp_workfile_limit_files_per_query前,先尝试通过修改 SQL、数据分布策略或者内存配置以降低溢出文件个数。

优化思路:

  • 优化SQL查询语句(查询语句写法、修改数据分布键等)
  • 改变数据分布,避免倾斜太严重
  • 调整系统memory配置(配置参数max_statement_mem, statement_mem,或者资源队列可以控制查询所使用的最大内存量)

步骤:

1. 检查数据分布倾斜

  • 查看一个表的分布键
  • 查看数据分布
  • 检查查询过程倾斜

1.1 查看一个表的分布键

可以使用psql中的\d+ 元命令来检查表的定义

 \d+ sales
                Table "retail.sales"
 Column      |     Type     | Modifiers | Description
-------------+--------------+-----------+-------------
 sale_id     | integer      |           |
 amt         | float        |           |
 date        | date         |           |
Has OIDs: no
Distributed by: (sale_id)

-- \d+meta-command

当我们创建复制表时,Greenplum数据库会在每个Segment上都存储一份完整的表数据。复制表没有分布键。 \d+元命令会展示分布表的分布键,复制表展示状态为Distributed Replicated。

1.2 查看数据分布

-- 如果所有的Segment都有大致相同的行数,一个表就可以被认为是分布均匀的。
 SELECT gp_segment_id, count(*) 
   FROM table_name GROUP BY gp_segment_id;
-- 如果在复制表上运行该查询会执行失败,因为Greenplum数据库不允许用户查询复制表的gp_segment_id 系统列数据。
-- 由于每个Segment上都有一份完整的表数据,复制表必然是均匀的。

1.3 检查查询过程倾斜

当一个查询被执行时,所有的Segment应该具有等量的负载来保证最好的性能。如果发现了一个执行性能低下的查询, 可能需要使用EXPLAIN命令进行深入研究

-- 如果表的数据分布策略与查询谓词没有很好地匹配,查询执行负载可能会倾斜
SELECT gp_segment_id, count(*) FROM table_name
   WHERE column='value' GROUP BY gp_segment_id;

-- 这将显示对于给定的WHERE谓词,Segment会返回的行数。

1.4 避免极度倾斜警告

# 当执行一个使用哈希连接操作的查询时,可能会收到下面的警告消息:
Extreme skew in the innerside of Hashjoin
当一个哈希连接操作符的输入倾斜时,就会发生这种情况。它不会阻碍查询成功完成。可以按照这些步骤来避免计划 中的倾斜:

确保所有的事实表都被分析过。

验证该查询用到的任何已填充临时表都被分析过。

查看该查询的EXPLAIN ANALYZE计划,并且在其中查找以下信息:

如果有带多列过滤的扫描产生超过预估的行数,则将gp_selectivity_damping_factor 服务器配置参数的值设置为当前值的2倍以上并且重新测试该查询。

如果在连接一个相对较小(小于5000行)的单一事实表时发生倾斜,将gp_segments_for_planner 服务器配置参数设置为1并且重新测试该查询。

检查应用于该查询的过滤属性是否匹配基表的分布键。如果过滤属性和分布键相同,考虑用不同的 分布键重新分布一些基表。

检查连接键的基数。如果基数较低,尝试用不同的连接列或者表上额外的过滤属性来重写该查询以降低行数。 这些更改可能会改变查询的语义。

2. 查看查询工作文件使用信息

Greenplum数据库管理方案gp_toolkit包含显示Greenplum数据库工作文件信息的视图。如果没有足够的内存让查询完全在内存中执行,Greenplum数据库会在磁盘上创建工作文件。
这些信息可以用来故障排查和查询调优。
这些视图中的信息也可以被用来为Greenplum数据库配置参数 gp_workfile_limit_per_query和gp_workfile_limit_per_segment 指定值。

在模式gp_toolkit中有下面这些视图:

gp_workfile_entries视图为当前在Segment上创建了工作文件的每个 操作符都包含一行。

gp_workfile_usage_per_query视图为当前在Segment上创建了工作 文件的每个查询都包含一行。

gp_workfile_usage_per_segment视图为每个Segment都包含一行。 每一行显示了当前在该Segment上用于工作文件的总磁盘空间。

3. 调整参数

如果SQL确实需要创建更多的溢出文件,那么可考虑修改gp_workfile_limit_files_per_query参数

gpconfig --show gp_workfile_limit_files_per_query
# 根据实际情况调整
gpconfig -c gp_workfile_limit_files_per_query -v 256GB
# gpconfig修改配置后,需要重启Greenplum

你可能感兴趣的:(Greenplum,数据库,postgresql,greenplum)