我使用数据库来表示文件列表,以及与每个文件相关联的一些元数据。我需要定期更新这个文件列表,只添加新文件和删除不再存在的文件(我不必触摸表中的现有行,因为我将丢失元数据)。
当我有大约10000个文件时,当前的查询只需要几秒钟,但是使用当前的150000个文件表需要一个小时。
在网上做了一些调查之后,我一直在做以下的工作:
用扫描结果填充表“newfiles”DELETE FROM files WHERE path NOT IN (SELECT path FROM newfiles);
INSERT INTO files (SELECT * FROM newfiles WHERE path NOT IN (SELECT path FROM files));
我还有索引:
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个文件时,这两个查询都需要一个多小时。
如何优化?
谢谢您。
最佳答案
尝试NOT EXISTS
而不是NOT IN
,如:
DELETE FROM files WHERE NOT EXISTS
(SELECT 1 FROM newfiles WHERE newfiles.path=files.path);
另外,如果每次都从头开始填充
newfiles
,请确保在发出使用它的任何查询之前ANALYZE newfiles
,以便优化器可以使用良好的统计信息。如果无法解决问题,请尝试对查询执行
EXPLAIN
或EXPLAIN ANALYZE
计划执行计划并将其附加到问题中。关于sql - Postgresql中的高效增量插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15876438/