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-validator jar包冲突的问题