postgresql中高效的增量插入

postgresql中高效的增量插入,sql,postgresql,postgresql-performance,Sql,Postgresql,Postgresql Performance,我使用数据库来表示文件列表,以及与每个文件相关联的一些元数据。我需要定期更新此文件列表,只添加新文件并删除不再存在的文件。我不必触摸表中的现有行,因为我将丢失相关的元数据 当我有大约10000个文件时,我当前的查询只需要几秒钟,而使用我当前的150000个文件表则需要一个小时 在互联网上进行了一些研究之后,我经历了以下过程: 用扫描结果填充表格newfiles 从路径不在的文件中删除从新文件中选择路径; 插入到文件中从新文件中选择*路径,其中路径不在从文件中选择路径中; 我还有索引: CREAT

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

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

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

用扫描结果填充表格newfiles 从路径不在的文件中删除从新文件中选择路径; 插入到文件中从新文件中选择*路径,其中路径不在从文件中选择路径中; 我还有索引:

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个文件时,这两个查询都需要一个多小时。 我如何优化它

谢谢。

请尝试不存在而不是不在,如:

另外,如果每次都从头开始填充新文件,请确保在发出任何使用它的查询之前分析新文件,以便优化器能够处理良好的统计信息

如果这不能解决问题,请尝试对查询进行解释或解释分析,以获得执行计划并将其附加到问题中。

尝试不存在而不是不在,如:

另外,如果每次都从头开始填充新文件,请确保在发出任何使用它的查询之前分析新文件,以便优化器能够处理良好的统计信息


如果这不能解决问题,请尝试对查询进行解释或解释分析,以获得执行计划并将其附加到问题中。

有时可行的选择是添加新分区:创建继承父表的新表,添加适当的约束,填充它,在其上创建索引。这只适用于新数据可以在单个约束条件下进行清晰分区的情况。这听起来更像是内存或磁盘IO问题。15万行不是一个很大的数目——也许你只需要给postgres分配更多的内存就可以了?即便如此,这张桌子有多大。从磁盘读取所有这些数据不需要一个小时。有时可行的选择是添加新分区:创建继承父表的新表,添加适当的约束,填充它,在其上创建索引。这只适用于新数据可以在单个约束条件下进行清晰分区的情况。这听起来更像是内存或磁盘IO问题。15万行不是一个很大的数目——也许你只需要给postgres分配更多的内存就可以了?即便如此,这张桌子有多大。从磁盘读取所有这些数据应该不需要一个小时。很抱歉,我完全忘记了我在这里问过这个问题-_-这非常有帮助,实际上现在每个查询只需要不到一秒钟的时间。在尝试了这两个选项之后,它使用的是notexists,而不是notin。非常感谢你!对不起,我完全忘了我在这里问过这个问题-_-这非常有帮助,实际上现在每个查询只需要不到一秒钟的时间。在尝试了这两个选项之后,它使用的是notexists,而不是notin。非常感谢你!
DELETE FROM files WHERE NOT EXISTS
  (SELECT 1 FROM newfiles WHERE newfiles.path=files.path);