Rails Rails 的 PostgresSQL 可能会支持延迟加载数据查询

gzhi1992 · 2018年08月24日 · 最后由 hooopo 回复于 2018年09月06日 · 2306 次阅读

刚看到一个很厉害的 PR。

PostgreSQL: Use a specialized Result object to defer retrieval of values

当没有明确指定需要查询的字段时候,Active Record 会默认加载查询的所有字段。一般情况下业务逻辑中需要用到的字段要比表里的要少很多,大多时候一次性查询所有字段的数据非常浪费,这个 PR 通过 pg 延迟加载的方式只获取用到的字段。

那岂不是很多 N+1?

pynix 回复

没有 N+1,数据是保存在 pg 内存当中(其实就是当前应用中),只是没有序列化成 ruby 对象。

还有 Active Record 对象里的字段其实也是延迟加载的,每当获取对应字段的时候才会从 pg result 去拿这个值。

gzhi1992 回复

那应该能省一部分内存。。

还不如自己手动写 select 字段

pynix 回复

主要是性能提升,这里有一个性能测试。

https://gist.github.com/larskanis/cd40185b962c8aaec6d77b4740a9ae52

性能差不多有一倍的提升,特别是在 includes 很多关联数据的情况下,提升会非常大。

pynix 回复

应该说是延迟反序列化准确些

通过只 select 你用到的字段也能达到相同的优化效果,就是手动 select 代码多写,容易写错,不易修改

嗯,就是延迟反序列化的过程,这里的 pg 也是说的 Ruby 库,跟 PostgreSQL 本身没什么关系。

PG::Result stores values received from the database internally in a compact memory format. When the value is accessed, it is converted to a ruby string or casted to another ruby object.

挺好的,就是 caching 不好做了…

需要 登录 后方可回复, 如果你还没有账号请 注册新账号