我正在编写一些Perl脚本来操作两个PostgreSQL数据库中的大量数据(总共大约4200万行,但不会在一次命中中完成). 对于我的一些查询,使用fetchall_hashref是很有意义的,因为我有合成键.但是,在其
对于我的一些查询,使用fetchall_hashref是很有意义的,因为我有合成键.但是,在其他情况下,我将使用三列数组作为唯一键.
这让我想知道fetchall_arrayref和fetchall_hashref之间的性能差异.我知道在这两种情况下,一切都进入内存,因此选择几GB数据可能不是一个好主意,但除此之外,在性能方面,文档中似乎没有什么指导.
我的谷歌搜索没有成功,所以如果有人能指出我的一些一般性能研究的方向,我将不胜感激.
(我知道我可以自己对此进行基准测试,但不幸的是,出于开发目的,我无法访问具有相同硬件和生产的机器,这就是为什么我正在寻找一般指导方针甚至是最佳实践).
第一个问题是你是否真的需要首先使用fetchall.如果你一次不需要内存中的所有4200万行,那就不要一次全部读取它们!正如ysth已经指出的那样,bind_columns和fetchrow_arrayref通常是可行的方式.假设确实需要fetchall,我的直觉是fetchall_arrayref会稍微快一点,因为数组是一个更简单的数据结构,不需要计算插入键的哈希值,但数据库读取时间的节省会相形见绌.时间,所以它不太可能是重要的.
但是,内存要求完全是另一回事. fetchall_hashref返回的结构是id =>的散列.行,每行表示为字段名称哈希=>场价值.如果你得到4200万行,这意味着你的4200万个散列键中的每一个都重复了你的字段名列表…这将需要比fetchall_arrayref返回的数组数组更多的内存来存储. (我想,除非DBI正在使用tie来优化fetchall_hashref结构.)