2016-08-26 2 views
6

Я работаю над приложением Spring-MVC с PostgreSQL и Hibernate, в котором у меня есть несколько таблиц, для которых количество строк превышает 1 лак (100 тысяч). Эти таблицы, я 95% времени доступа только к последним данным, и просеивание через все эти строки занимает много времени. Много раз планировщик запросов даже не использовал индексы (по неизвестным причинам).Спящий режим: разбиение таблицы автоматически каждый месяц

Затем я думал о разделении таблиц базы данных каждую неделю, поэтому мы можем просто получить доступ к первой базе данных последних месяцев, а затем, если пользователь запросит, в запрос будет добавлено больше результатов из предыдущей таблицы.

Для выполнения большинства запросов требуется JOIN для нас, как таблицы, сопоставленные с одним-ко-многим.

Один из файлов моделей, в которых число строк превышает 100 тысяч.

Модель:

@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 обеспечить какую-либо стратегию или способ решить эту проблему? Спасибо.

+0

Это звучит, как это может быть хорошее время, чтобы рассмотреть альтернативные источники данных, такие как дописывания только войти магазин , – chrylis

+0

@chrylis: Как я могу запросить их или получить из него определенный набор данных? –

ответ

0

Что о том, расколе данных между несколькими таблицами, как:

  • текущих значений (до недели) - таблица latest_values ​​
  • также старых значений (до года) - таблица year_values ​​
  • все значения (полная история) - таблица all_values ​​

Вставьте всегда впоследние_значения, и правила также подталкивают их к другим.

На ежедневной или еженедельной основе вы запускаете «УДАЛИТЬ ИЗ последних_значений WHERE insert_date < CURRENT_DATE - 7». На ежемесячной основе вы запускаете «DELETE FROM year_values ​​WHERE insert_date < CURRENT_DATE - 365» (високосные годы здесь не имеют значения).

Таким образом, вы сохраняете таблицы небольшими и можете легко получать более текущие значения и все же иметь все значения под рукой, если запрос им понадобится.

Разделение каждую неделю в отдельную таблицу (так я понимаю вашу идею) оставит вас с слишком большим количеством таблиц и сложным - таким образом, медленным - операции UNION, если вам нужны данные из многих недель.

0

Вы можете добавить новый столбец как период. Будет сохранена строка года-месяца. Это будет действовать как разделение. Когда вы запускаете запрос для последних данных, вы можете указать, какой период (YYYYMM) вы ищете. Это уменьшит накладные расходы, с которыми вы сталкиваетесь прямо сейчас.

Если вы действительно хотите иметь разделенную DB, который является лучшим решением для этой задачи проверить это PostgresSQL DOC

+0

Как я могу это сделать? Вручную? –

Смежные вопросы