Greenplum 数据库 - Count Distinct Queries 缓慢的问题

Posted

技术标签:

【中文标题】Greenplum 数据库 - Count Distinct Queries 缓慢的问题【英文标题】:Greenplum Database -Problem of Count Distinct Queries Slowness 【发布时间】:2021-09-28 19:04:37 【问题描述】:

我们正在为数据仓库使用 Greenplum OSS 版本,并在其中提供数 TB 的数据。

我们有一个特殊的问题是 Count(distinct) 查询不执行,并且执行计划是由 Postgres 查询优化器而不是 GPORCA 准备的

以下是有关问题的详细信息。 任何人都可以提供相同的帮助

基础设施背景:- 一种。 8 个数据节点的集群 湾。每个节点上 16 个 vcpu C。每个节点上 32 GB RAM d。每个节点 8 个段 e.集群 IOPS - 读取 - ~4 GB/s

数据背景:-

    1.2 亿条记录的完全分布式表 - 64 个段 每个 Segment 包含 – 200 万条记录

需求背景和面临的问题:-

    20+ 独立属性被探测为动态时间输入的不同值。 (需要注意的重点->这些属性本质上是独立的,因此不能通过group by子句将它们组合在一起,并且需要distinct)

    Count(distinct) - 我们需要在 10 秒内的交互式查询响应来处理仪表板的这些计数。 (但获得 180+ 秒的响应时间)

我们的分析:-

    根据解释计划,甚至没有为这些查询调用 GPORCA,并且 Postgres 查询优化器正在准备执行计划 我们尝试创建追加优化的行/列表,以尝试增加响应时间,但没有明显的改进。 关闭 - “optimizer_force_multistage_agg” - 未产生任何效果。- 响应时间 - 192 秒 关闭 - “enable_groupagg” - 未产生任何效果 - 响应时间 - 192 秒 开启 - “enable_hashagg” - 响应时间 - 120 秒

基于以上事实,我们想知道

    为什么没有启用 GPORCA 优化器 为什么 count(distinct) 查询花费的时间比 count(*) 查询多 15 倍。是否未使用并行化。 我们如何优化这些查询。 是否有其他替代方案可以满足此要求。

【问题讨论】:

【参考方案1】:

几个观察:

只是为了确认一下,ORCA 已在数据库范围内开启(优化器=开启)? 具有 16 个 vCPU 的 8 个段的 CPU 与段的比率为 2:1。 VMmware 一般建议每段 3-4 个 cpu 32 GB RAM 对我来说对于每个主机这么多段来说似乎有点小。

问题:

您是否在表上运行了 analyze 或 analyzeb(不确定是否是开源版本)以确保统计信息完全是最新的? 您是在 20 个属性中的 1 个上执行 select distinct,还是您正在运行 select distinct on 的多个属性的组合?如果是第一个,是否在最常用的列上建立了索引? 您是否尝试过对查询进行解释分析,以便准确了解问题所在? 这个表有多少列?

吉姆·麦肯 VMware Tanzu 数据

【讨论】:

以上是关于Greenplum 数据库 - Count Distinct Queries 缓慢的问题的主要内容,如果未能解决你的问题,请参考以下文章

GreenPlum SQL 查询转换成 Hive

请教一个问题,arduino怎么读取一个字节里的某两位数据

"HybridDB · 性能优化 · Count Distinct的几种实现方式” 读后感

在 Greenplum 中实现公用表表达式

学习笔记分析函数(开窗函数)

Greenplum数据库Greenplum简介及安装