postgresql中的高效增量插入

时间:2013-04-08 10:08:37

标签: sql postgresql postgresql-performance

我使用数据库来表示文件列表,以及与每个文件关联的一些元数据。我需要定期更新这个文件列表,只添加新文件并删除不再存在的文件(我没有触及表中的现有行,因为我会丢失相关的元数据)。

当我有大约10000个文件时,我当前的查询只需要几秒钟,但是使用我当前的150000文件表需要一个小时。

在互联网上进行一些研究之后,我一直在进行以下过程:

  1. 使用扫描结果填充表格“newfiles”
  2. DELETE FROM files WHERE path NOT IN (SELECT path FROM newfiles);
  3. INSERT INTO files (SELECT * FROM newfiles WHERE path NOT IN (SELECT path FROM files));
  4. 我也有索引:

    CREATE INDEX "files_path" ON "files" ("path");
    CREATE INDEX "files_path_like" ON "files" ("path" varchar_pattern_ops);
    CREATE INDEX "files_path" ON "newfiles" ("path");
    CREATE INDEX "files_path_like" ON "newfiles" ("path" varchar_pattern_ops);
    

    (我主要使用这些索引在数据库中搜索;我的应用程序在文件中有搜索引擎。)

    当我有150000个文件时,这两个查询中的每一个都需要一个多小时。 我该如何优化呢?

    谢谢。

1 个答案:

答案 0 :(得分:1)

尝试使用NOT EXISTS代替NOT IN,如:

DELETE FROM files WHERE NOT EXISTS
  (SELECT 1 FROM newfiles WHERE newfiles.path=files.path);

此外,如果每次从头开始填充newfiles,请确保在发出使用它的任何查询之前ANALYZE newfiles,以便优化程序可以处理好的统计信息。

如果仍然无法解决问题,请在查询中尝试EXPLAINEXPLAIN ANALYZE以获得执行计划并将其附加到问题中。