如何将 memsql 用于组合多个表的报告
Posted
技术标签:
【中文标题】如何将 memsql 用于组合多个表的报告【英文标题】:How to leverage memsql for reports that combining multiple tables 【发布时间】:2020-01-02 20:11:30 【问题描述】:我们使用 memsql 列式存储数据库。 我们为后端架构中的每个“偶数类型”创建管道,并为它创建一个专用表(我们称之为“源表”)。所以每个管道都会写入 memsql 上的一个表(又名源表)
我们为客户提供不同的业务报告,其中包含来自多个源表的数据(不是我们可以加入的必要表,因为有些字段可以存在于一个表中而有些则不存在)
因此,克服这个问题的唯一方法是创建包含 UNION 函数的庞大而复杂的查询,这使得事情变得难以维护和理解
什么是维护和保持这种架构的最佳实践,这将允许我们在多个源表上创建多个报告并降低查询复杂性。
我们认为的一种方法是对每个报告进行专门的查看。但我们不确定我们是否会走这条路。我们需要创建外部 ETA,它将向该视图添加越来越多的数据(日常流程) 您对此有何看法?这可能是一种方式吗?
使用 UNION 函数处理大量查询的第二种方法(在运行时) 我们不喜欢这种方式,因为它在查询时运行时运行复杂
我想提一下,这些报告不需要实时更新。我们可以从一个更新到另一个缓冲(小时)
想法?
【问题讨论】:
为什么要添加 amazon-redshift 标签?如果不相关,请删除。 因为它基于相同的技术.. columnstore 数据库 【参考方案1】:我看到了两种可能的策略:优化读取或优化写入。您有一个可以将数据快速摄取到“源”表的管道。这绝对是针对写入优化的。但现在你正在为阅读而苦苦挣扎。视图不是一个坏方法,但每次运行报表时都会产生连接成本。
考虑让管道(或其他管道)将数据非规范化为报告所需的格式。这不是带有嵌入式连接的视图,而是另一种特定于相关读取的数据存储。 (是的,重复数据,但存储成本很低,并且假设经常使用报表,此策略会将转换计算转移到摄取时的单个计算,而不是在每次运行报表时重复。)
如果您发现您经常需要为不同的报告加入标准数据,或者报告更加临时性,请考虑更改“源”表架构以包含这些字段,并在管道提取期间填充它们。然后,您可以使用更简单的查询来实现速度而无需重复表。像这样的非规范化数据肯定有重复的元素——所以写入更复杂——但读取效率更高。
【讨论】:
因此您建议使用管道为报告创建专用表格。这意味着我们不再需要“源”表,因为我们将一直查询专用报告。我们还需要一直修改我们的管道(根据报告请求) 对。这是一个可以考虑的选择。也许这会将计算移到前面,在每次报告运行时消除它。也许您的业务需求表明这不是一个好的举措,您可以考虑其他选择。 我在这里发现的问题是您将如何为这些管道提供数据?我的意思是我们有 kafa 管道,可以听不同的主题。如果我们考虑您的方式,这意味着我们将不得不将所有“持久”事件仅发送到一个主题。这意味着我们所有的业务服务都需要将其“审计”消息发送到该主题,以便我们可以将该主题提供给不同表的多个管道。这可以被视为常见做法吗? 这里的问题也可能是表演。因为我们将有多个管道来监听一个主题。意味着管道将丢弃与它们不相关的消息 有趣。因此,一份报告跨越多个 Kafka 主题。听起来像非规范化数据的管道不起作用,因为它无法一次访问所有数据。以上是关于如何将 memsql 用于组合多个表的报告的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2)