2012-01-23 72 views
2

我正在尝试重新设计Pg数据库以获得更多性能。 Db适用于ERP IS,并且拥有较大的日期(四年)。每年都在单独的数据库中,这是一个糟糕的解决方案(建设报告是一个痛苦的??),所以我把所有四个数据库合并成一个......但是......一些表格只是大到!为了获得一些性能,我决定将数据分成表格。我有2种方法来做到这一点。PostgreSQL - 查看或分区?

首先:将表格分成“arch_table”和“working_table”并使用视图进行报告。第二:使用分区(比如说每一年的单独分区)。

所以,我的问题是哪个方法更好?分区或一些存档系统?

回答

8

PostgreSQL的分区实际上是一堆使用检查约束来验证每个分区中只有正确数据的视图。创建一个父表和其他分区创建从主继承:

CREATE TABLE measurement (
    city_id   int not null, 
    logdate   date not null, 
    peaktemp  int, 
    unitsales  int 
); 

CREATE TABLE measurement_y2006m02 () INHERITS (measurement); 
CREATE TABLE measurement_y2006m03 () INHERITS (measurement); 
... 
CREATE TABLE measurement_y2007m11 () INHERITS (measurement); 
CREATE TABLE measurement_y2007m12 () INHERITS (measurement); 
CREATE TABLE measurement_y2008m01 () INHERITS (measurement); 

很显然,我省略了一些代码,但你可以在PostgreSQL table partitioning检查出的文档。分区最重要的部分是确保您构建自动脚本以创建未来的新分区以及合并旧分区。

在操作上,当PostgreSQL运行你的查询时,它看起来好像是SELECT * FROM measurement WHERE logdate BETWEEN '2006-02-13' AND '2006-02-22';优化器会出现“AH HA!我知道这里有什么,有一个分区,我只要看看表measurement_y2006m02并撤回相应的数据。

随着年龄的增长数据从主分区,你可以只删除旧表,否则将它们合并到一个归档分区。这些工作大部分都可以通过脚本实现自动化 - 您真正需要做的就是编写一次脚本并对其进行测试。一个好处是,旧数据往往不会改变 - 许多分区不需要索引维护或抽真空。

请记住,分区主要是数据管理解决方案,可能无法提供您需要的性能优势。调整查询,应用索引以及检查PostgreSQL配置(postgresql.conf,存储配置和操作系统配置)可能会导致更高的性能提升,从而对数据进行分区。

2

您应该使用任何这些方法进行分区。这正是你需要的。

+1

你能详细说一下吗? – EmirZ