【问题标题】:SQL query performance, archive vs status changeSQL 查询性能、归档与状态变化
【发布时间】:2018-06-17 05:59:54
【问题描述】:

直截了当,我尝试在 google 和 SO 上进行搜索,但找不到我要查找的内容。这可能是因为我的搜索措辞不正确。

我的问题是,
我有几张桌子,每年可以容纳 1,000 到 100,000 行。我想弄清楚,我/我应该如何处理归档数据?我对数据库没有很好的经验,但下面是我想出的一些方法,我不确定哪种方法更好。当然要考虑性能和易于编码。我正在使用 Java 1.8、Sql2o 和 Postgres。

方法一 每年将数据归档到单独的数据库中。
我不太喜欢这种方法,因为当我们想要搜索旧数据时,我们的应用程序将需要搜索不同的数据库,并且为此添加更多代码对我来说很麻烦。

方法二 将数据归档到单独的数据库中,用于存储 2-3 年之前的数据。
并使用在线状态来提高性能。 (参见方法 3)这是我倾向于作为“最佳”解决方案的东西,其中代码不那么复杂,但数据库也保持相对干净。

方法三 只需为每一行设置状态(例如:A=active,R=Archived)以可能提高查询的性能。只需使用“select * from table where status = 'A'”来减少要查看的行数。

【问题讨论】:

  • 方法3,加上适当的索引(这很重要)应该没问题。或者根本没有方法,只是适当的索引。 100000/年听起来并不多(除非你从大爆炸开始就在线)。
  • 这个问题听起来最好在dba.stackexchange.com上问
  • 您如何决定应该归档哪些行?如果它只是基于日期/时间戳。您可以相应地对表进行分区。

标签: java sql postgresql sql2o


【解决方案1】:

每年 100,000 行并不多。 [1]

无需将其移至单独的位置。如果您已经有了良好的索引,那么这些年来您几乎肯定不会注意到任何性能下降。

但是,如果您想绝对确定,您可以添加 year 列并为其创建索引(或将其添加到现有索引中)。但实际上,仅对您知道需要它的表执行此操作。例如,如果您的表已经有一个 date 列,它是您的索引的一部分,则您不需要单独的 year 列。

[1] 除非您有数以千计的列和/或包含大型二进制 blob 的列 - 这似乎不是这里的情况。

【讨论】:

    【解决方案2】:

    正如 Vog 所说,100,000 行并不是很多。也不是 1,000,000 或 5,000,000 - 您的表可能会增长到的大小。

    在许多数据库中,您可以使用聚集索引,其中第一个键是“活动”列。但是,Postgres 并不真正支持聚集索引。

    相反,我建议您查看table partitioning。这是一种将底层存储拆分为不同“文件”的方法。您可以使用where 子句中的分区键轻松指定查询读取一个或多个分区。

    对于您的特定用例,我会进一步建议仅针对活动数据查看数据。这只会读取一个分区,因此性能应该与读取仅包含最新数据的表几乎相同。

    也就是说,我不确定是通过active 标志还是year 进行分区更好。这取决于您访问数据的方式,尤其是旧数据。

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 2013-07-02
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-24
      相关资源
      最近更新 更多