Postgresql 你如何找到一个程序的限制因素?
我创建了一个程序,可以解析文件中的数据并将其导入到关系型postgresql数据库中。 这个程序已经运行了两周,看起来还剩下几天了。平均每秒约150次进口我如何才能找到限制因素并加快速度? 我的程序的CPU没有超过10%,内存没有超过7%。 Postgresql数据库CPU的内存不超过10%和25% 我猜限制因素是硬盘的写入速度,但我如何验证,如果是这样的话;改进它?(除了购买更快的硬盘) 这是“iostat-d-x”的输出: 正如您可能猜到的,数据库在sdb上 编辑:我正在解析的文件约为7GB。 对于文件中的大部分(但不是全部)数据,我逐行查看,下面是一个示例“Postgresql 你如何找到一个程序的限制因素?,postgresql,benchmarking,bulkinsert,Postgresql,Benchmarking,Bulkinsert,我创建了一个程序,可以解析文件中的数据并将其导入到关系型postgresql数据库中。 这个程序已经运行了两周,看起来还剩下几天了。平均每秒约150次进口我如何才能找到限制因素并加快速度? 我的程序的CPU没有超过10%,内存没有超过7%。 Postgresql数据库CPU的内存不超过10%和25% 我猜限制因素是硬盘的写入速度,但我如何验证,如果是这样的话;改进它?(除了购买更快的硬盘) 这是“iostat-d-x”的输出: 正如您可能猜到的,数据库在sdb上 编辑:我正在解析的文件约为7GB
- 如果ID不存在,将零件A插入表格A返回ID
- 如果ID不存在,则在返回ID的表格B中插入partB
- 如果关系的ID不存在,请创建它
- 否则更新关系(使用日期id)
这是我的postgresql.conf文件的副本:我更改的唯一内容是默认数据目录和内存限制。你应该在很多很多天前终止这个过程,并不是问
如何找到应用程序的限制因素,而是问:
有没有更快的方法导入数据
进入pgSQL
看一看,然后是。使用适当的工具,您正在运行的导入过程可能在数小时而不是数周内完成
顺便说一句,无论您使用的是什么RDBMS,程序化数据插入的性能都不如RDBMS供应商提供的用于处理此类批量操作的本机工具。例如:SQL Server有bcp、DTS/SSI和其他一些用于批量数据导入/导出的选项。Oracle有自己的等。小心您的硬盘LED灯t、 它几乎总是开着吗?如果是的话,那就是你的瓶颈。如果它只是偶尔开着,那就不是了。简单地说:-)它几乎不停地开着,但它只是表示在硬盘上写东西,而不是写东西的速度越快越好。@lanrat先生:程序运行得越快,磁盘就是瓶颈。@Mehrdad好的,很短如果你有足够的内存,你可以把这个文件放进一个RAM磁盘。你有多少RAM?这看起来是个好主意,但问题是我正在解析的文件不是一个很好的csv或类似格式。它是它自己独特的格式,有重复的数据。还有,dat文件中的a被放入多个表中,具有多对多关系。我添加了有关我用于将数据导入问题的过程的更多信息,如果我仍然可以将copy命令与这样的方法一起使用,请告诉我。我看到了您的问题。但出于前面提到的性能原因,我建议您导入首先将数据插入数据库中的临时表中,然后从那里将数据插入适当的表中。之后,您可以/应该删除初始表。此解决方案与您制定的解决方案非常不同,不涉及单独的应用程序。您可以在pgSQL中完成所有工作。PostgreSQL 9.1将支持<代码>不记录日志创建表
,对于需要批量导入数据,然后处理并发送数据的人来说,这将是一个梦想成真。@Sean:很高兴知道。感谢分享。我还想知道,在这种情况下,不同的数据库引擎是否会有所帮助。例如,如果我遇到Lanrat先生的困境,我会使用SQL Server bcp或SSIS/DTS要导入数据,请使用T-SQL过程对其进行处理,然后通过SSIS或一组格式正确的文件将其导出到Postgres,以便与COPY一起使用。
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.59 3.23 0.61 1.55 23.15 38.37 28.50 0.01 5.76 1.04 0.22
sdb 0.02 308.37 21.72 214.53 706.41 4183.68 20.70 0.56 2.38 2.24 52.89