Postgres在写入数据库

时间:2017-08-09 20:06:42

标签: postgresql heroku

我有一个在Heroku上托管的Postgres 9.6数据库(标准4,带15GB缓存)。

我的一个表有几乎100M的行,而且该表平均每分钟可以获得3k次插入/更新,但这可能会达到10倍。

我有几个针对该表运行的查询基本上计算具有不同值的不同列的行。

我还有一份当前没有更新的数据库副本(基本上是空闲的)。

对实时数据库的查询比副本上的查询慢得多,我不知道这是由于更新的加载/争用还是我的查询优化不佳。

查询所计算的值是非常常见的值。

select count(*)
from my_table
where a = '123'
  and b = 'abc'

123abc的组合有很多行。我为此创建了一个部分索引:

create index my_table_abc_123_index
on my_table (a, b)
where a = '123' and b = 'abc'

这似乎让我得到一个索引,只扫描副本上的快速(~0.5s),但在实时DB(~26s)上慢得多。成本也差异很大(先复制,直播第二):

Aggregate  (cost=29751.39..29751.39 rows=1 width=8)

Aggregate  (cost=179603.59..179603.59 rows=1 width=8)

这两个都返回大约1.4M的计数,表格大小相同。

当写入速度提高(10倍)时,降级也很明显。

有趣的是,Postgres并不总是选择我的部分索引,选择(a, b)上的完整复合索引,具体取决于为这些列传递的值。

我已经阅读了Postgres索引文档,并意识到对于常见值,使用索引并不总是最好(尽管Postgres在所有这些情况下都选择了索引)。

我想知道这是否是我应该期望在实时和空闲数据库之间的那种差异,以及我是否正在接近为我的工作负载正确创建索引(这肯定是写得很重)或者总的来说。

其他一些细节:

  1. 个别(完整)列索引看起来要贵得多,但我没有尝试过单独的列部分索引。
  2. 由于大量更新,autovacuum阈值设置得相当低(0.01)以处理死行

0 个答案:

没有答案