Hibernate:每月自动拆分表

Posted

技术标签:

【中文标题】Hibernate:每月自动拆分表【英文标题】:Hibernate : Splitting table automatically every month 【发布时间】:2017-01-03 00:05:20 【问题描述】:

我正在使用 PostgreSQL 和 Hibernate 开发 Spring-MVC 应用程序,其中我有几个表的行数超过 10 万(10 万)。这些表,我有 95% 的时间只访问最新数据,并且筛选所有这些行非常耗时。很多时候查询规划器甚至不使用索引(原因我不知道)。

然后我想到了每周拆分数据库表,这样我们就可以先访问最近几个月的数据库,然后如果用户请求,那么以前表的更多结果将直接添加到请求中。

我们执行的大多数查询都需要 JOIN,因为表是一对多映射的。

行数大于 10 万的模型文件之一。

型号:

@Entity
@Table(name = "groupnotehistory")
public class GroupNoteHistory 

    @Id
    @Column(name = "mhistoryid")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mhistory_gen")
    @SequenceGenerator(name = "mhistory_gen", sequenceName = "mhistory_seq")
    private int mhistoryid;


    @Column(name = "mnoteeditdate",columnDefinition = "timestamp without time zone")
    private Timestamp mnoteEditDate;

    @Column(name = "oldheadline", columnDefinition = "character varying")
    @Type(type="jasyptHibernateEncryptor")
    private String oldHeadLine;

    @Column(name = "oldtext", columnDefinition = "character varying")
    @Type(type="jasyptHibernateEncryptor")
    private String oldText;

    @Column(name = "newnotetext", columnDefinition = "character varying")
    @Type(type="jasyptHibernateEncryptor")
    private String newNoteText;

    @Column(name = "newnoteheadline", columnDefinition = "character varying")
    @Type(type="jasyptHibernateEncryptor")
    private String newNoteHeadline;


@JsonIgnore
    @ManyToOne
    @JoinColumn(name = "mnoteid", nullable = false)
    private GroupNotes mhistory;
// Getters and setters


Hibernate 是否提供任何策略或方法来解决此问题?谢谢你。

【问题讨论】:

听起来这可能是考虑替代数据存储的好时机,例如仅附加的日志存储。 @chrylis : 我如何查询它们或从中检索特定的数据集? 【参考方案1】:

如何将数据拆分到多个表中,例如:

当前值(最多一周)- 表 latest_values 还有旧值(最多一年)- 表 year_values 所有值(完整历史记录)- 表 all_values

始终插入 latest_values 并让规则也将它们推送到其他值。

您可以每天或每周运行“DELETE FROM latest_values WHERE insert_date

通过这种方式,您可以使表保持较小,并且可以轻松检索更多当前值,并且在查询需要时仍然可以使用所有值。

每周拆分成一个单独的表(这就是我理解您的想法的方式)会给您留下太多的表和复杂的 - 因此很慢 - 如果您需要数周的数据,则 UNION 操作。

【讨论】:

【参考方案2】:

您可以添加一个新列,例如句点。这将存储添加的年月行。 这将充当分区。 当您对最近的数据运行查询时,您可以指定您要查找的时间段 (YYYYMM)。这将减少您现在面临的开销。

如果您真的想要分区数据库,这是解决此问题的最佳解决方案,请查看此 PostgresSQL DOC

【讨论】:

我该怎么做?手动?

以上是关于Hibernate:每月自动拆分表的主要内容,如果未能解决你的问题,请参考以下文章

Hibernater入门笔记

hibernater-validator jar包冲突的问题

请说说你对Hibernat的理解?JDBC和Hibernate各有什么优势和劣势?

Hibernat 原生SQL运行结果集处理方法

在 2 个表之间拆分 Hibernate 实体

如何在休眠中映射自动增量字段?