【问题标题】:Schema for analytics table in PostgresPostgres 中分析表的架构
【发布时间】:2013-11-10 20:09:37
【问题描述】:

我们使用 Postgres 进行分析(星型模式)。 每隔几秒钟,我们就会收到大约 500 种指标类型的报告。 最简单的模式是:

timestamp      metric_type     value
78930890       FOO              80.9
78930890       ZOO              20

我们的 DBA 提出了一个建议,将相同 5 秒的所有报告扁平化为:

timestamp   metric1     metric2     ...  metric500
78930890    90.9        20          ...  

一些开发人员反驳说这增加了开发的巨大复杂性(批处理数据以便一次性编写)和可维护性(仅查看表格或添加字段更复杂)。

DBA 模型是此类系统中的标准做法,还是仅在原始模型明显不够可扩展时才采取的最后手段?

编辑:最终目标是为用户绘制折线图。所以查询主要是选择几个指标,按小时折叠它们,然后选择每小时(或任何其他时间段)的最小/最大/平均。

编辑:DBA 参数是:

  1. 这与第 1 天相关(见下文),但即使这不是系统最终需要做的事情,从另一个架构迁移也会很痛苦

  2. 将行数减少 500 倍将允许更高效的索引和内存(在此优化之前该表将包含数亿行)

  3. When selecting multiple metrics the suggested schema will allow one pass over the data instead of separate query for each metric (or some complex combinations of OR and GroupBY)

编辑:500 个指标是“上限”,但实际上大多数时候每 5 秒只报告约 40 个指标(虽然不是相同的 40 个)

【问题讨论】:

  • 对模式的查询有什么作用?他们需要做多少工作才能在相同的时间戳上相互比较指标值?
  • 你的 DBA 对这种(过早的)非规范化的论点是......?
  • 你DBA是在提倡500列?这似乎……对于 DBA 来说是不寻常的。
  • all - 查看刚刚编辑的详细信息

标签: postgresql analytics time-series star-schema


【解决方案1】:

DBA 的建议并非完全不合理如果指标是相当固定的,并且组合在一起是有意义的。不过,您可能会遇到几个问题:

相反,您可能要考虑使用 HSTORE 列:

CREATE TABLE metrics (
    timestamp INTEGER,
    values HSTORE
)

这将使您在存储属性方面具有一定的灵活性,并允许使用索引。例如,仅索引其中一项指标:

CREATE INDEX metrics_metric3 ON metrics ((values->'metric3'))

这样做的一个缺点是值只能是文本字符串……因此,如果您需要进行数字比较,那么 JSON 列可能也值得考虑:

CREATE TABLE metrics (
    timestamp INTEGER,
    values JSON
)
CREATE INDEX metrics_metric3 ON metrics ((values->'metric3'))

这里的缺点是您需要使用 Postgres 9.3,它还是相当新的。

【讨论】:

  • "timestamp" 和 "values" 都是保留字 (postgresql.org/docs/current/static/sql-keywords-appendix.html),因此不建议作为列名选择。此外,JSON 在 Postgresql 9.2 (postgresql.org/docs/9.2/static/datatype-json.html) 中发布。
  • 这是一个很好的观点,重新。 timestampvalues。而且,是的,JSON 类型是在 9.2 中添加的,但除了存储/检索整个 JSON blob(此时它可能只是一个BLOB)之外,还需要 9.3。
  • 同意,在 9.2 中,支持非常初级。我以两种不同的方式解决了这个问题:使用 9.3 中的一些向后移植的扩展(pgxn.org),以及使用 plv8 函数进行更复杂的处理(和索引!)。
猜你喜欢
  • 1970-01-01
  • 2019-03-25
  • 2015-12-06
  • 1970-01-01
  • 2019-09-25
  • 2011-02-10
  • 2017-10-14
  • 1970-01-01
相关资源
最近更新 更多