最近,我需要监视文件更改并在某些目录中收集文件信息。所以我用python来做。但是我发现文件名可能在不同的子目录中重复。我需要识别这些重复的文件并标记较旧的文件。我以自己的方式尝试过。但是程序重复识别太慢(超过30分钟且尚未完成)。因此,我必须找到另一种方式-仅使用sql。并在10秒内完成。我想知道sql比我快得多。该算法可能有助于改善自己。
python代码有很多行,所以我在这里描述一下:
从数据库中读取所有数据(数据库文件信息);
识别所有新文件并收集它们的信息(此步骤并不慢)
将新文件与DB-files-data进行比较(程序只是获取一个新文件,并使用单个字段将其与所有DB数据进行比较)
1.python2.6
2.oracle11g(无设置索引)
3.data:大约500000行
update table set data_status = 0
where duplicated_field in (select duplicated_field from table group by duplicated_field having count(duplicated_field) > 1)
and time not in (select max(time) from table group by duplicated_field having count(duplicated_field) > 1)
我希望有人可以告诉我有关sql如此快速的主要原因。
答案 0 :(得分:0)
这是您的查询:
update table
set data_status = 0
where duplicated_field in (select duplicated_field
from table
group by duplicated_field
having count(duplicated_field) > 1
) and
time not in (select max(time)
from table
group by duplicated_field
having count(duplicated_field) > 1
);
我不认为这可以满足您的需求。有两个问题。首先,带有子查询的not in
很危险。如果子查询返回 any NULL
值,则没有行匹配。第二,令人困惑的时代。因此,从一个duplicated_field
开始的时间可以与另一个时间的最长时间相匹配。
我希望有一个相关的子查询。所以:
update table
set data_status = 0
where time < (select max(t2.time)
from table t2
where t2.duplicated_field = t.duplicated_field
);
关于为什么这在数据库中更快。数据库旨在有效地处理数据。它们具有多种提高性能的机制,包括大量高级算法,索引和查询优化器。另外,仅将数据移至Python可能会占用大量资源。