有没有办法配置Heroku PostgreSQL不打扰将特定列加载到RAM?

时间:2012-07-10 22:00:47

标签: postgresql heroku

这可能是一个长镜头,但我想我还是会问。

我正在考虑使用Heroku的新Crane Postgres DB(400 MB RAM缓存)以及我正在Heroku上部署的应用程序。 400 MB缓存大小应该足以满足我们的需求...除了一个表的一列,我们将缓存的PDF文件存储为字符串。如果Heroku使用它的Cache,PDF可以很快地轻松使用400MB RAM。

如果我在一个实际的服务器上,我只是将PDF存储为文件,但是如果我只使用Heroku的临时文件系统,那么如果我只是将pdf存储在数据库中而不是绑定到连接中,那么我的生活就会简单得多。 S3只是为了这件事。 (这更加复杂,我们正在考虑部署多个heroku实例,每个客户端一个......所以使用数据库比为每个客户端创建一个新存储桶更简单。)我真的不关心速度。如果人们正在获取文件,那么无论如何,他们都会期望速度好像来自文件系统,因为大多数文件下载都是如此。有没有办法告诉PostGRES不打扰缓存这个专栏?

或者我可能会问错误的问题,还有其他方法可以解决问题或设计使其无关紧要的替代方案。

3 个答案:

答案 0 :(得分:4)

您无需做任何事情。 PostgreSQL会在大于8 kB的值上自动使用TOAST。

来自http://www.postgresql.org/docs/9.1/static/storage-toast.html

  

PostgreSQL使用固定页面大小(通常为8 kB),并且不允许元组跨越多个页面。因此,不可能直接存储非常大的字段值。为了克服这种限制,将大字段值压缩和/或分解成多个物理行。这对用户来说是透明的,对大多数后端代码只有很小的影响。该技术被亲切地称为TOAST(或“切片面包以来最好的东西”)。

PostgreSQL缓存也在页面级别完成,因此TOAST不必与行的其余部分一起缓存(http://www.westnet.com/~gsmith/content/postgresql/InsideBufferCache.pdf)。 / p>

答案 1 :(得分:3)

事实上,Postgres可以获得大量的场地值,这并不意味着它是最好的事情。

如果在主数据库中存储大字段,则会使许多事情变得更难,例如创建分支或关注者,特别是创建和恢复备份。我强烈反对利用S3来存储PDF文件,并且只需投资新客户端的自动入门(创建heroku应用程序,配置数据库,提供/创建S3存储桶)。

答案 2 :(得分:0)

我不太确定你是如何设置存储大型PDF的,因为Postgres规定了最大字段大小(或至少是最大页面大小)。但是,您可以通过使用TOAST来解决这个问题。 TOASTed项目存储在单独的(物理)表格中,因此如果您不经常选择它们,则不应缓存它们。
如果你经常选择它们,那么我不确定你想要的是什么。请记住,Postgres只提供一个“级别”的缓存 - Linux VFS也提供缓存。