Эффективное выявление различий - PullRequest
0 голосов
/ 16 февраля 2019

Каждый день мы получаем огромные файлы от разных поставщиков в разных форматах (CSV, XML, custom), которые нам необходимо загрузить в базу данных для дальнейшей обработки.

Проблема в том, что эти поставщики будут отправлять полный дамп своих данных, а не только обновления.У нас есть некоторые приложения, в которые нам нужно только отправлять обновления (то есть только измененные записи).В настоящее время мы загружаем данные в промежуточную таблицу, а затем сравниваем их с предыдущими данными.Это мучительно медленно, так как набор данных огромен, и мы иногда пропускаем SLA.

Есть ли более быстрый способ решить эту проблему?Любые предложения или помощь с благодарностью.У наших программистов заканчиваются идеи ..

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Стандартное решение для этого - хеш-функции.У вас есть возможность взять каждую строку и вычислить идентификатор + хэш ее содержимого.Теперь вы сравниваете хэши, и если они одинаковы, то вы предполагаете, что строка одинакова.Это несовершенно - теоретически возможно, что разные значения будут давать одно и то же значение хеш-функции.Но на практике вам нужно больше беспокоиться о том, что космические лучи вызывают случайные перевороты в вашем компьютере, чем о хэш-функциях, которые не работают, как обещано.

Обе rsync и git являются примерами широко используемыхпрограммное обеспечение, которое использует хэши таким образом.

В общем случае вычисление хэша перед его помещением в базу данных выполняется быстрее, чем выполнение серии сравнений внутри базы данных.Кроме того, это позволяет распределять обработку по нескольким машинам, а не ограничивать ее в базе данных.А сравнение хешей - это меньше работы, чем сравнение многих полей, вне зависимости от того, делаете ли вы это в базе данных или нет.

Существует множество хеш-функций , которые вы можете использовать.В зависимости от вашего приложения вы можете использовать криптографический хеш, хотя вам, вероятно, и не нужно.Больше битов лучше, чем меньше, но 64-битный хэш должен подойти для приложения, которое вы описываете.После обработки триллиона дельт у вас все равно будет меньше 1 шанса на 10 миллионов, если вы допустили случайную ошибку.

0 голосов
/ 16 февраля 2019

Существует ряд шаблонов для обнаружения дельт, то есть измененных записей, новых записей и удаленных записей, в полных наборах данных дампа.

Один из наиболее эффективных способов, которые я видел, - это создание хэшазначения строк данных, которые у вас уже есть, создайте хеши импорта, как только он будет в базе данных, затем сравните существующие хеши с входящими хешами.

Совпадение первичного ключа + совпадение хэша = неизмененная строка

Совпадение первичного ключа + несоответствие хеша = обновленная строка

Первичный ключ во входящих данных, но отсутствует в существующем наборе данных= Новая строка

Первичный ключ не во входящих данных, а в существующем наборе данных = Удаленная строка

Способ хэширования зависит от продукта базы данных, но все основные поставщики имеют своего родав них доступно хеширование.

Преимущество заключается в том, что нужно сравнивать только небольшое количество полей (столбцы первичного ключа и хэш), а не выполнять анализ поля по полю.Даже довольно длинные хеши могут быть проанализированы довольно быстро.

Это потребует небольшой переделки обработки импорта, но затраченное время окупится снова и снова при увеличении скорости обработки.

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