【问题标题】:smalldatetime in PostgreSQLPostgreSQL 中的小日期时间
【发布时间】:2014-01-30 09:59:59
【问题描述】:

我有一个包含数百万个日期/时间数据行的 PostgreSQL 数据库。数据的时间范围是从 2004 年至今。时区始终为 UTC。 由于我的虚拟主机帐户的磁盘空间有限,我想尽可能减少数据库大小。我知道在 Microsoft SQL Server 中有一个 SMALLDATETIME 数据类型,大小为 4 字节。

Postgres 中是否有与 SMALLDATETIME 等效的内容?

(注意:我查看了 Postgres 手册,但所有的“日期和时间”都是 8 个字节。4 字节的“日期”数据类型不适合我的需要,因为我需要在几分钟内解决问题。)

【问题讨论】:

    标签: postgresql datetime


    【解决方案1】:

    不,没有这种类型。对于一些用例来说会很好,但它不受支持。

    作为妥协,你可以做的是存储自你的偏移时代以来的秒数:

    extract(epoch from mydate) - extract(epoch from TIMESTAMP '2004-01-01 00:00:00')
    

    integer 列中,然后即时重建日期。这会影响性能,更重要的是,会降低可读性,但它会起作用。

    SELECT to_timestamp(mydatesecondssince2004 + extract(epoch from TIMESTAMP '2004-01-01 00:00:00')) FROM mytable
    

    或者,您可能是决定添加“smalldate”和“smalltimestamp”类型的人; PostgreSQL 是开源的,这意味着人们需要做一些事情,如果他们希望发生的话。

    【讨论】:

    • 它实际上看起来像旧版本的 postgres 使用称为 abstime 的 4 字节日期/时间,但现在已弃用。我对 Postgres 的磁盘存储要求进行了更多研究。似乎有 24 字节的行开销!因此在日期时间中保存 4 个字节不会有很大的不同。我很惊讶 Postgres 是多么“渴望磁盘空间”,MSSQL 的行开销只有 7 个字节......
    • @jirikadlec2 MS SQL 是否保留回滚日志/重做日志,并替换 主表中的行?如果是这样,就像 Oracle 一样,这意味着它不需要在主表中存储事务可见性信息,这大大减少了行大小 - 代价是对正在更改的表进行查询,而这些表的读取速度要慢得多扫描回滚日志。我不相信 PostgreSQL 的权衡是正确的,但在这一点上改变并不容易......
    • 在 Postgresql 中节省磁盘空间的最佳选择可能是将我的“窄”表合并到一个“宽”表中。现在我有大约 10 个单独的表,例如 TEMPERATURE(station_id, time, value) 或 RAINFALL (station_id, time, value)。相反,我会创建一个表 HOURLY_DATA(station_id, time, temperature_value,雨量值),从而减少存储数据所需的行数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-23
    • 2012-02-28
    • 2012-09-07
    • 2010-12-21
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    相关资源
    最近更新 更多