我正在运行一个或多或少开箱即用的 Postgresql 安装,但运行速度非常慢。
我正在使用 Perl 解析一大堆日志文件,并使用 Perl 的 DBI 接口(通过 IP 地址 127.0.0.1 连接到数据库)将数据添加到数据库。我的数据库大约有 4 个表。我的脚本基本上会检查规范化数据是否已经存在。如果数据不存在,它会将其添加到数据库。否则,它会提取用于更新其他表的键。
我在大约具有 2GB RAM 的台式机硬件上运行它,但我没想到它能在 5 天多的时间内添加大约 1200 万行。
PS. 我确实将 shared_buffers 的大小增加到了 RAM 的 25%,但这并没有带来太大的变化。
任何建议都将受到感谢。
编辑:我正在运行 Ubuntu Linux
答案1
我编写了脚本来执行您正在执行的操作(主要原因是从 Squid 缓存解析日志文件)。您正在运行的查询可能相当基础,并且假设您没有代理主键,则应该使用主键上的隐式索引。不过,您始终可以“EXPLAIN ANALYZE”您的查询,以确保它们看起来就像您期望的那样。
基本性能分析是您的首要任务。您没有提到您正在运行的操作系统,所以我无法给您提供详细的说明,但您应该使用底层操作系统性能监控功能来确定瓶颈在哪里(CPU、I/O、内存分页等)。即使是“top”和“任务管理器”等简单工具也可以快速为您提供一些想法。
下一步是对脚本进行性能分析。找出脚本花费最多时间的地方并优化这些部分。
假设脚本从数据库检索的值在脚本运行时不会发生变化,您可能需要考虑缓存执行期间检索的数据。例如,使用代理主键,您可以在脚本执行期间将自然键到代理键的映射缓存在关联数组中,并节省对相同值的重复数据库查询。我发现这通常是一个大胜利TM。