PostgreSQL表太大了?


127

我正在为我的公司进行RoR项目的设计,而我们的开发团队已经对设计(尤其是数据库)进行了一些辩论。

我们有一个Message需要持久化的模型。这是一个非常小的模型,除了id之外只有三个db列,但是当我们投入生产时,可能会有很多这样的模型。我们每天要查询多达1,000,000次插入。只能通过可索引的两个外键来搜索模型。同样,不必删除模型,但是一旦它们使用了大约三个月,我们也不必保留它们。

因此,我们想知道的是,在Postgres中实现此表是否会带来严重的性能问题?有没有人有使用大型SQL数据库的经验来告诉我们这是否会成为问题?如果是这样,我们应该选择哪种选择?


3
具有良好的缓存层和PG中的一些少量配置,就可以了。您应该逐案处理性能问题,并避免进行预优化。也就是说,一旦遇到瓶颈,分区和复制始终是不错的选择。
2014年

1
这里这里相关的问题。
Erwin Brandstetter 2014年

5
我们每天在一个5 TB以上的PostgreSQL数据库中处理大约3000万条消息,效果很好。
Frank Heikens 2014年


1
仅供参考,我碰巧今天在阅读postgresql.org/,并注意到它说(原则上)表中的行数是无限的。
Al Chou

Answers:


115

每张表的行数本身就不会成为问题。

因此,大致来说,每天一百万行90天是9000万行。我不认为Postgres不能解决这个问题,而又不知道您正在做的所有细节。

根据数据分布的不同,可以在看到可能存在或不存在哪些性能问题后,将索引,过滤索引和某种类型的表分区混合使用以加快处理速度。在我所知道的任何其他RDMS上,您的问题将相同。如果您只需要3个月的数据设计时间即可修剪掉数据,那么您就不需要了。这样,您将在表上保持一致的数据量。幸运的是,您知道将存在多少数据,对其容量进行测试并查看获得的结果。测试一个具有9千万行的表可能很容易:

select x,1 as c2,2 as c3
from generate_series(1,90000000) x;

https://wiki.postgresql.org/wiki/常见问题解答

Limit   Value
Maximum Database Size       Unlimited
Maximum Table Size          32 TB
Maximum Row Size            1.6 TB
Maximum Field Size          1 GB
Maximum Rows per Table      Unlimited
Maximum Columns per Table   250 - 1600 depending on column types
Maximum Indexes per Table   Unlimited

19
我同意9000万行对于PostgreSQL来说不是问题。但是对于使用PostgreSQL的ORM 来说可能是个问题。(实际上是具有任何dbms的ORM。)
Mike Sherrill'Cat Recall'

@ MikeSherrill'Catcall'好一点,我只是关注“ PostgreSQL表太大了吗?”
Kuberchaun 2014年

2
@yeyo:因为ORM通常使用大量查询来获取仅用一两个即可返回的数据。OP正在使用Ruby on Rails。
Mike Sherrill'Cat Recall'15

39
这有点晚了,但是我认为在很多情况下(尤其是在使用rails / active record的情况下),通常会从等式中完全删除ORM并编写原始sql字符串以进行性能查询。不要让您的ORM为您制定数据决策!它不是必需品。
Stefan Theard's

2
URL中引用的About URL当前不显示这些限制-任何人都知道将其移至何处?
Shorn

58

在具有超过1亿行的表上显着加快查询速度的另一种方法是,在非工作时间将表集中在查询中最常用的索引上。我们的表有超过2.18亿行,并且发现改进了30倍。

另外,对于很大的表,最好在外键上创建索引。


>在非工作时间群集中,查询中最常用的索引表....您能解释一下如何完成吗?
间谍

6
是的,这是一个逐步的示例。示例:1)在本示例中,我所引用的表称为投资。2)查询中最常用的索引是(bankid,record_date),这是您逐步执行的操作:1)psql -c“删除索引investment_bankid_rec_dt_idx;” dbname 2)psql -c“在投资上创建索引investment_bankid_rec_dt_idx(bankid,record_date);” 3)psql -c“群集上的investment_bankid_rec_dt_idx投资;” 4)vacuumdb -d ccbank -z -v -t投资因此,在第一步和第二步中,我们删除索引并重新创建它。
James Doherty

3
步骤3我们创建了集群,基本上将数据库表按索引的物理顺序放置,因此当postgresql执行查询时,它将缓存最有可能的下一行。第4步,我们清理数据库以重置查询计划者的统计信息
James Doherty
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.