| 
  
 
  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 - это записи А, которых нет в В, В-А - записи В, которых нет в А. Если были изменения, то записи в А и В будут разные, и пересечения не будет.
 
 > То же самое, по сути, только тот код, о котором мы говорили, уже кем-то прописан в СУБД. Но головной боли для тебя меньше, это да
  
 Надеюсь что пригодится многим или еще идеи предложат
  |