【问题标题】:How to optimize a table for queries sorted by insertion order in Postgres如何优化 Postgres 中按插入顺序排序的查询的表
【发布时间】:2013-02-12 16:15:25
【问题描述】:

我有一个时间序列数据表,对于几乎所有查询,我希望选择按收集时间排序的数据。我确实有一个时间戳列,但我不想为此使用实际的时间戳,因为如果两个条目具有相同的时间戳,那么我能够按照它们被收集的顺序对它们进行排序是至关重要的,这是我在插入时间。

我当前的架构只有一个时间戳列。我将如何更改我的架构以确保我可以根据收集/插入时间进行排序,并确保按收集/插入顺序进行查询是有效的?

【问题讨论】:

    标签: postgresql database-schema


    【解决方案1】:

    基于序列(即序列)添加列,并在(timestamp_column,serial_column)上创建索引。然后您可以通过以下方式获得广告订单(或多或少):

    ORDER BY timestamp_column, serial_column;
    

    【讨论】:

    • 这就是要走的路。最重要的是,您可以在下班时间安排CLUSTER tbl USING this_index
    • 这不是个好主意,因为集群需要对表进行访问排他锁。
    • 我想你错过了我写“下班时间”的部分。那是您负担得起排他锁的时候。如果你不能,那不是下班时间。
    • 嗯,在我熟悉的情况下,下班时间意味着流量减少,但不是“没有流量”。并且,如果任何表在集群上有意义(即大表),这将花费大量时间。
    • 我有很多情况可以在周日 3:00 等时间运行 CLUSTER。如果您没有看到太多更新,即使是一次运行 CLUSTER 也可以在很长一段时间内显着提高性能。在某些情况下,我几乎无法使用CLUSTER。它归结为您的具体情况。您必须权衡成本和收益,并为您的案例定义“下班时间”。一般来说,称之为“不是一个好主意”是..不是一个好主意。
    【解决方案2】:

    您可以使用名为 insert_order 的 SERIAL 列。这样就不会有两行具有相同的值。但是,我不确定您是否可以实现绝对时间顺序的要求。

    例如,假设有两个事务,T1 和 T2,并且它们确实同时发生,并且您在具有多个处理器的机器上运行,所以实际上 T1 和 T2 都在完全相同的时刻进行了插入。这是您关心的案例吗?您的问题没有足够的信息确切地知道。

    对于序列列,您也存在间隙问题,例如 T1 云抓取序列值 14,而 T2 可以抓取值 15,然后 T1 回滚而 T2 不回滚,因此您必须期望 insert_order 列可能有里面有空隙。

    【讨论】:

    • 请注意,serial保证时间顺序。
    • @ams 我将更改问题以解决您的问题,我可以看出它是多么模棱两可。
    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多