【问题标题】:Is there a performant way to search by a non-partitioned column in crateDB?是否有一种通过 crateDB 中的非分区列进行搜索的高效方法?
【发布时间】:2021-12-07 17:41:20
【问题描述】:

在过去的几年里,我和我的团队一直在为我们的一个项目使用 crate。我们有一张包含数亿条记录的表,性能是关键。

随着我们在这个项目上开发越来越多的功能,我们遇到了有趣的问题。我们在这个表上有一个标记为“persist_date”的列,这是记录实际保存到表中的时间。这些日期可能并不总是一致,我们的 start_date 可能是 2021-06-21,persist_date 是 2021-10-14。

到目前为止,我们所有的查询都可以轻松地添加针对 start_date 的分区。现在我们遇到了一个问题,需要我们使用非分区列(persist_date)来查询。

据我了解,crateDB 确实非常高效,但仅当您一次查询 1 个特定分区时才可以。我现在的问题是如何在不重复数据的情况下为其他日期列创建分区?除了分区之外还有什么可能有帮助的,比如表的集群方式?

【问题讨论】:

  • 请问您的个人分片/分区有多大?没错,CrateDB 将尝试将查询限制在可以保存数据的分区/分片上,即分区值用于过滤掉分片。但是无论如何查询都将以高度并行化的方式完成,并且非分区列上的选择也应该很快。
  • 我们的分区目前在“开始日期”按周。在persist_date(非分区列)上搜索了几个星期,我发现查询需要90秒以上,大多数大约30秒。使用分区或查询较小的日期范围后,我会在一秒钟内得到结果。

标签: cratedb


【解决方案1】:

您可以将两列都用作分区值。 例如

CREATE TABLE two_parted (a TEXT, b TEXT, val DOUBLE) PARTITIONED BY (a,b);

如果在选择中使用ab,这会将查询限制为具有任一值的分片。但是,这可能会导致更多的分片,因此您可能希望不是每天,而是每周或每月进行分区。

【讨论】:

  • 感谢您的快速回答。不过,我确实对这个解决方案有些担心。这将使分片数量增加一倍。我不确定将分片数量加倍是我们想要做的事情。根据文档,我发现“如果分区列选择不当,最终可能会导致集群中的分片过多,从而对整体稳定性和性能产生负面影响。”这有点担心一些。是否有关于围绕多个列分区的分区的其他文档?
猜你喜欢
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
相关资源
最近更新 更多