SQL查询性能,存档与状态更改

时间:2018-06-17 05:59:54

标签: java sql postgresql sql2o

直截了当,我已经尝试在Google上搜索,但却无法找到我正在寻找的东西。可能是因为没有正确地搜索我的搜索。

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

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

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

方法3 只需拥有每一行的状态(例如:A =有效,R =已存档),以便可能提高查询的性能。只需要从表中选择*,其中status =&#39 ; A' "减少要查看的行数。

2 个答案:

答案 0 :(得分:1)

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

没有必要将它移到一个单独的地方。如果您已经拥有良好的索引,那么您几乎肯定不会注意到这些年来任何性能下降。

但是,如果您想完全确定,可以添加year列并为其创建索引(或将其添加到现有索引)。但实际上,只对那些你知道自己需要它的桌子这样做。例如,如果您的表格中有date列,这是您索引的一部分,那么您就不需要单独的year列。

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

答案 1 :(得分:0)

正如Vog所提到的,10万行并不是很多。也不是1,000,000或5,000,000 - 你的桌子可能增长的尺寸。

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

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

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

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