Super Member
Покинул форум
Сообщений всего: 773
Дата рег-ции: Апр. 2009
Откуда: Днепропетровск
Репутация: 69
|
Задача
Нужно найти изменения в большой таблице, имея два дампа таблицы. Как это лучше сделать? Какой принцип?
> В каком формате данные?
В текстовом виде (постгрес), также есть ежедневные дампы БД и доступ к серверу БД с текущим содержимым БД.
> Идея 1: Проще всего отсортировать оба дампа по какому-то полю быстрой сортировкой и отбрасывать совпадения, начиная с начала.
> Скорость алгоритма О(n log(n))
> Если изменения могли быть только путем вставки/удаления записей, то достаточно по ключевому полю. А если могли быть изменения в существующих записях, то по всем полям.
> И вот еще - после сортировки при сравнении строк, нужно в каждом файле пропускать строку, если она оказалась "раньше" в порядке сортировки, чем строка второго файла.
> Это если не совпали строки. А потом, все такие пропущенные строки - это и будут изменения.
Есть ли ещё варианты, кроме как сравнения по всем полям ..( около 2 млн.записей ... 20 полей)?
> Чтобы сравнить - достаточно побитово вычесть одну строку из другой. Или по XOR сложить. Если не 0, значит не совпадают.
А варианты ещё быстрее есть?..
> Только эвристики - вычленить те поля, которые могли изменяться вероятнее всего.
> Идея 2: Ну, есть еще SQL-ный подход. Просто вычесть две таблицы друг из друга
> Например
CODE:(select * from a minus select * from b) union (select * from b minus select * from a)
> вычитаем сначала вторую из первой, потом первую из второй и объединяем записи.
Может сделать пересечение, а не объединение, чтобы не было повторений?
> Пересечение вместо объединения даст тебе скорее всего пустое множество. Ведь сначала делается вычитание.
Зато будут видны только изменения, а не добавления или удаления
SQL-ный подход, наверное, будет шустрее! ...спасибо за идею
> Нет, будет Пустое множество A-B - это записи А, которых нет в В, В-А - записи В, которых нет в А. Если были изменения, то записи в А и В будут разные, и пересечения не будет.
> То же самое, по сути, только тот код, о котором мы говорили, уже кем-то прописан в СУБД. Но головной боли для тебя меньше, это да
Надеюсь что пригодится многим или еще идеи предложат |