почему поиск повторов sql так быстро чем я - PullRequest
0 голосов
/ 05 июля 2019

В последнее время мне нужно отслеживать изменения файлов и собирать информацию о файлах в определенном каталоге. Поэтому я использую Python для этого. Но я обнаружил, что имя файла может дублироваться в разных дочерних каталогах. Мне нужно распознать эти дубликаты файлов и пометить старый. Я попробовал это по-своему. Но программа очень медленная с распознаванием дубликатов (более 30 минут и еще не закончена). Поэтому я должен найти другой путь - просто с помощью sql. И все закончилось за 10 секунд. Интересно, как sql намного быстрее меня. Алгоритм может помочь улучшить себя.

Коды Python состоят из множества строк, поэтому я просто опишу их здесь:

  1. чтение всех данных (DB-files-information) из базы данных;

  2. распознает все новые файлы и собирает их информацию (этот шаг не медленный)

  3. сравнение новых файлов с данными DB-files (программа просто берет один новый файл и сравнивает все данные БД, используя одно поле)

1.python2.6
2.oracle11g (без индекса установки)
3. данные: около 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 голосов
/ 05 июля 2019

Это ваш запрос:

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 с подзапросами опасно.Если подзапрос возвращает любое значение 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 может быть ресурсоемким процессом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...