为什么SQL查找重复比我快?

时间:2019-07-05 09:54:38

标签: python sql oracle

最近,我需要监视文件更改并在某些目录中收集文件信息。所以我用python来做。但是我发现文件名可能在不同的子目录中重复。我需要识别这些重复的文件并标记较旧的文件。我以自己的方式尝试过。但是程序重复识别太慢(超过30分钟且尚未完成)。因此,我必须找到另一种方式-仅使用sql。并在10秒内完成。我想知道sql比我快得多。该算法可能有助于改善自己。

python代码有很多行,所以我在这里描述一下:

  1. 从数据库中读取所有数据(数据库文件信息);

  2. 识别所有新文件并收集它们的信息(此步骤并不慢)

  3. 将新文件与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如此快速的主要原因。

1 个答案:

答案 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可能会占用大量资源。