【问题标题】:Need help deciding between json and jsonb regarding time series storage in postgresql需要帮助在 json 和 jsonb 之间决定关于 postgresql 中的时间序列存储
【发布时间】:2021-05-20 15:32:46
【问题描述】:

我想将时间序列数据存储到 postgresql 中。数据通过 http 请求(使用 Django)进入 json 包。格式如下:

{
"2018-01-01 21:44": 53.2,    
"2018-01-01 21:48": 51.7,    
"2018-01-01 21:52": 48.5,    
...
}

我通常每天为每个注册的设备获取大约 700-800 个值。这并不多,我决定将所有值存储到一个 json 字段中(因为它可以容纳高达 1GB 的数据)。

但是我需要对这些数据进行切片(例如,从 2018 年 3 月到 2019 年 4 月,或任何其他任意 - 由用户选择 - 间隔),我认为检索整个 json 字典并不是最佳选择并在我的应用程序中制作切片。我认为切片应该在 Postgres 中完成。

我已经读到关于性能 JSONB 更好,但它不保留密钥排序(即时间戳)——所以,我猜在优先选择单个记录的情况下,JSONB 是首选。我说的对吗?

应用程序有一些实时用途(在实时 Web 应用程序上观察数据变化),因此性能至关重要。

请记住,我的时间戳数据中没有重复的键。

我倾向于 JSON 而不是 JSONB。但是我对此不太确定。

你有什么建议?

【问题讨论】:

    标签: json postgresql


    【解决方案1】:

    这两种选择都是错误的。您的数据是表格的,如果您使用普通的“标量”数据类型将每个数据存储在自己的表格行中,我保证您会更开心。

    数据库已针对存储具有大量行的表进行了优化,因此不用担心。

    只要你想(例如)计算所有这些值的聚合,JSON 就会让你不高兴。

    【讨论】:

    • 谢谢。聚合将通过算法完成(在 Python 上使用 Pandas)
    • 这也是错误的。您想将数百万行传输到客户端,让一个缓慢的 Python 应用程序在那里进行数字运算?再想想。
    • 对于少量数据,任何东西都可以很好地工作。我也不想说 Pandas 不好。将所有数据传输到客户端而不是在数据库中聚合它们对我来说似乎很尴尬。在数据库中使用SQL,就如SELECT sum(value) FROM tab WHERE timestampcol BETWEEN '2021-05-01' and '2021-05-31';一样简单。
    • 那就是SELECT date_trunc('hour', tscol), sum(val) FROM tab GROUP BY date_trunc('hour', tscol);
    • 这取决于。几个大行的顺序扫描可能比许多小行慢一些(TOAST)。对于索引扫描,表的大小无关紧要。
    猜你喜欢
    • 2011-06-09
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多