【问题标题】:Insert into PostgreSQL/PostGIS database is too slow插入 PostgreSQL/PostGIS 数据库太慢
【发布时间】:2013-11-21 02:23:07
【问题描述】:

我正在开展一个项目,该项目需要我获取实时 Twitter 提要并将其中的记录存储在 PostgreSQL 数据库中。该项目要求存储推文的位置数据,以便在 PostGIS 下进行搜索。我正在使用 perl 脚本来获取 Twitter 提要(使用 AnyEvent::Twitter::Stream 和 Twitter API)。每 5000 条推文,脚本 fork()s 和子进程发出 SQL 以插入行。我正在使用 AutoCommit => 0 来加快插入速度。

问题是子进程在下一个 5000 条推文进入之前没有完成存储 5000 条推文,所以我得到了许多 postgres 进程。我需要弄清楚如何加快数据库插入速度,以使子进程在下一个启动之前退出。

子进程现在(针对每条推文)执行的任务是:

  • 在 tweets 表中插入一条记录,使用 ST_GeomFromEWKT 将纬度/经度数据转换为 GIS 坐标
  • 确保推文的作者和推文中提到的任何用户都在用户表中
  • 在相关表格中插入提及用户和主题标签

任何有关诊断速度或加快过程的建议都会很有帮助。这最终必须实时工作,因此临时表和文本文件不是好的选择。该服务器是运行 Debian 的双至强 HP 服务器,内存为 8G。

【问题讨论】:

  • [Bulk load][1],是否考虑将其增加到 5000 以上? [1]:stackoverflow.com/questions/758945/…
  • 你怎么能问性能,然后不给出任何数字?您是否每小时、每分钟、每秒获取 5000 条推文?您在 RAID10、U 盘中使用 16 x SSD 的磁盘是什么?

标签: perl postgresql twitter postgis


【解决方案1】:

在 postgres 文档中是关于通过滥用 insert from select 子句来加速插入的评论。 这似乎是一个显着的差异,你尝试过吗?

更快插入的有用提示: 您可以使用 INSERT INTO tbl 语法通过将插入批处理在一起来加快插入速度。比如……

INSERT INTO my_table SELECT 1, 'a' UNION SELECT 2, 'b' UNION SELECT 3, 'c' UNION ...

如果您为每个 INSERT 语句批量处理多组值并在每个事务中批量处理多个 INSERT 语句,则可以显着提高插入性能。通过使用这种技术批量处理 100 个(小),我设法在 PostgreSQL 8.1 / Win2K 安装上实现了几乎 8 倍的插入速度。

否则,如果您无法使 postgres 达到所需的速度,您可以在 HP 盒子上检查您的 IO 性能。

另外,检查插入后是否有很多索引要更新。也许您甚至需要告别许多约束(FK 约束)。这将允许以任何顺序插入记录,并且在插入推文之前无需等待创建用户。

我还会检查是否有可能在您收集推文时检查数据库中的用户。 最后但同样重要的是,您应该实现一个队列来插入 5000 条推文的批次,而不是简单地将它们发送到数据库。

【讨论】:

  • 很好的回应,以及建议将推文收集到队列中的奖励。
  • 放弃对用户名的单独检查已解决问题,因此查找速度太慢了。队列过程比仅使用单个事务更好吗?
  • 如果您的数据库变得太慢而无法处理您的请求,您的应用程序将使数据库过载。使用队列方法,您甚至可以在大容量处理期间停止数据库,重新启动它,最终它会赶上“实时”。队列不会替换事务。它在事务开始之前将要处理的数据排队。如果数据库空闲,它将立即从队列中删除。
【解决方案2】:

I've benchmarked performance of creating points,而ST_GeomFromEWKT 是最慢的方法。尝试在准备好的语句中使用ST_MakePoint 以尽量减少任何开销:

use DBI;

# Prepare an insert
$sth=$dbh->prepare("INSERT INTO mytable (geom) ".
                   "SELECT ST_SetSRID(ST_MakePoint(?, ?), 4326) AS geom");

# In a for-loop of 5000 points, do the insert
$sth->execute($longitude, $latitude);

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多