slow从十亿行greenplum数据库中选择

8nuwlpux  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(370)

我在greenplum上创建了下表:

CREATE TABLE data."CDR"
(   
   mcc text, 
   mnc text, 
   lac text, 
   cell text,
   from_number text,
   to_number text,
   cdr_time timestamp without time zone
) 
WITH (
  OIDS = FALSE,appendonly=true, orientation=column,compresstype=quicklz, compresslevel=1
)
DISTRIBUTED BY (from_number);

我已经将10亿行加载到这个表中,但每个查询的速度都非常慢。
我需要对所有字段进行查询(不仅仅是一个字段),
如何加快查询速度?
使用分区?使用索引?
可能使用不同的数据库,如cassandra或hadoop?

qlckcl4x

qlckcl4x1#

这在很大程度上取决于您正在执行的实际查询以及您的硬件设置。
因为你要查询所有的字段,所以选择列方向可能对你的伤害大于帮助,因为你无论如何都需要扫描所有的数据。我会去掉柱状方向。
一般来说,索引在greenplum系统中没有帮助。通常,所涉及的硬件数量往往会使扫描数据目录比执行索引查找更快。
分区可能会有很大的帮助,但需要更好地理解数据。您可能正在访问特定的时间间隔,因此在cdr\u时间周围创建分区方案可以消除对结果不需要的数据的扫描。我最不担心的是索引。
按发件人号码分发可能会影响查询速度。系统将根据from\u编号对数据进行散列,因此,如果您有选择地查询from\u编号,则数据将仅由拥有该编号的节点返回,而不会利用系统的并行特性并将请求分散到所有节点。除非您是从\u number连接到上的其他表(允许在节点内并置和执行连接),否则我会将其更改为随机分布。
除此之外,还有一个问题,即硬件是什么,以及是否有适当数量的段设置和资源来提供它们。基本上每一段都是一个数据库。好的硬件可以为每个节点处理多个段,但是如果您在轻硬件上执行此操作,则需要找到段数与底层系统可以提供的匹配的最佳点。

xhv8bpkk

xhv8bpkk2#

@多尔,
我的数据类型与电信公司存储cdr信息的数据类型相同,每天插入1000-1200万行,并且在这些cdr相关的表上运行大量查询,去年我也面临同样的问题,我在cdr timings列的这些表上创建了分区。
根据我的理解,gp为每个分区创建物理表,而逻辑表是在其他rdbms中创建的。在这之后,我得到了更好的性能与所有选择这些表。另外,我认为您应该将文本数据类型转换为所有列的字符变化(如果真的不需要文本)我觉得文本字段上的db操作非常慢(特别是order by、group by)
索引将帮助您取决于您的查询在我的情况下,我有巨大的插入,所以我还没有尝试
如果要选择中的所有列,请选择,这样就不需要面向列的表
当做

相关问题