The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Раздел полезных советов: Сравнение таблиц на удаленных серве..."
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Разговоры, обсуждение новостей (Public)
Изначальное сообщение [ Отслеживать ]

"Раздел полезных советов: Сравнение таблиц на удаленных серве..."  
Сообщение от auto_tips (??) on 20-Мрт-09, 14:42 
Пришлось придумать как сравнить довольно таки объемные таблицы на предмет одинаковости данных в заданном поле.
Сравнивать построчно слишком долго и накладно таскать эти объемы по сети.
Выход посчитать md5 сумму по колонке для всех значений.

Для этого выбираем поле по которому будем сравнивать, поле должно быть независимым от серверов.
Делаем из него blob, и считаем md5.

Пример: есть таблица A и поле B.

   select md5(array_send(array(select B from A order by 1))) as md5;

после это сравнив md5 суммы с обоих серверов можно утверждать об одинаковости набора данных.


URL:
Обсуждается: https://www.opennet.ru/tips/info/1994.shtml

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Сравнение таблиц на удаленных серверах PostgreSQL"  
Сообщение от Аноним (??) on 20-Мрт-09, 14:42 
Увы, нельзя утверждать. Коллизии никто не отменял.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Сравнение таблиц на удаленных серверах PostgreSQL"  
Сообщение от Aleksey (??) on 20-Мрт-09, 14:47 
>Увы, нельзя утверждать. Коллизии никто не отменял.

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

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Сравнение таблиц на удаленных серверах PostgreSQL"  
Сообщение от uldus (ok) on 20-Мрт-09, 15:11 
А если "B" текстовое поле и данных уйма,  от такого PostgreSQL ресурсы не съест ?

Для текстовых данных лучше еще один вызов md5 добавить:

select md5(array_send(array(select md5(B) from A order by 1))) as md5;


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Сравнение таблиц на удаленных серверах PostgreSQL"  
Сообщение от Aleksey (??) on 20-Мрт-09, 18:29 
В реальности все намного хуже. Мы же не учитываем порядок и ключ у таблицы. На примере: в первой таблице у Васи 100 рублей, у Пети 200. Во второй - наоборот. Просчет md5 по рублям даст один и тот же результат для этих двух таблиц. Т.е. они типа равны :)

Поэтому в реальной ситуации надо использовать ключевые поля. Пусть в таблице A два поля - обычное B и ключевое K, тогда

select md5(array_send(array(select md5('' || K) || md5('' || B) from A order by K))) as md5;

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Сравнение таблиц на удаленных серверах PostgreSQL"  
Сообщение от Александр Макаренко on 22-Мрт-09, 10:41 
Это, наверное, выйдет за рамки задачи, которая стояла перед автором. :) Хотя довольно интересно. Если развивать Вашу идею далее, может выйти функция, обращающаяся к системным таблицам pg_*. :)
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Сравнение таблиц на удаленных серверах PostgreSQL"  
Сообщение от Тормал email on 23-Мрт-09, 19:07 
Ну ни кто не запрещал добавлять дополнительные условия во WHERE. Я только предложил методику. Так как у меня порядка 30 миллионов записей в таблице. Мне нужно было сравнить  наборы данных. И естественно я просматривал некоторые таблиц разбив на сегменты по дате например.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Сравнение таблиц на удаленных серверах PostgreSQL"  
Сообщение от konst email(??) on 24-Мрт-09, 18:15 
1. а что мешает делать вывод поля таблицы в файл (используя нужный order by x,y,z), а далее сравнивать по md5 сами файлы?
2. играясь опциями LIMIT/OFFSET можно вычислить "тонкое место" (где данные не совпадают), чтобы не таскать по сети большие объемы. а далее использовать diff...
3. Для этой цели можно написать скриптик, который сам все сделает:
Напр.:
1) с помощью limit/offset выгрузит поле в 100 (1000) файликов.
2) md3sum по ним с рез-тами в файл >> md5_1 (1-й сервер), md5_2 (2-й)
3) diff md5_1 md5_2
4) если найдены расхождения - diff по "несовпадающим" файлам...

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Сравнение таблиц на удаленных серверах PostgreSQL"  
Сообщение от Тормал email on 24-Мрт-09, 20:43 
Собственно говоря а зачем файлы ?
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Сравнение таблиц на удаленных серверах PostgreSQL"  
Сообщение от konst email(??) on 24-Мрт-09, 20:49 
>Собственно говоря а зачем файлы ?

2 причины:
1) меньше нагрузка на БД (?)
2) иногда может потребоваться не только констатировать факт различий, но и найти их...

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Сравнение таблиц на удаленных серверах PostgreSQL"  
Сообщение от Тормал email on 24-Мрт-09, 20:57 
LIMIT/OFFSET можно использовать на лету. Дальше поиск делением где различия. Нагрузка на БД как раз будет больше при создании файлов. Так как диск используется дважды. + Сортировка по полям съест тотже объем памяти что и при подсчете md5.
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру