Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сравнение двух датасетов / 23 сообщений из 23, страница 1 из 1
17.02.2017, 12:11
    #39406452
Olga.IOVOVA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Добрый день!

Имеется следующая задача - нужно сравнить два идентичных по структуре набора данных(2 среза одной таблицы). Нужно определить идентичны они или нет.
Количество строк может достигать 500 млн.
...
Рейтинг: 0 / 0
17.02.2017, 12:14
    #39406456
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Olga.IOVOVA,

minus
...
Рейтинг: 0 / 0
17.02.2017, 12:19
    #39406464
Olga.IOVOVA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
AmKad,

на таком объеме данных будет очень долго работать, а такие сравнения нужно сделать не для одной таблице
...
Рейтинг: 0 / 0
17.02.2017, 12:27
    #39406474
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Если найдете способ быстрее - скажите.
...
Рейтинг: 0 / 0
17.02.2017, 12:30
    #39406476
Сравнение двух датасетов
AmKad,

ТС ничего не рассказал о структуре и составе своих срезов. Может там LONG-и, LOB-ы и прочие радости, неподдерживаемые оператором MINUS.
...
Рейтинг: 0 / 0
17.02.2017, 12:33
    #39406480
Авдруг
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
1. Может есть отдельные поля, которые заведомо дадут разницу, там id какие-нибудь? )
2. В каждой таблице сделать отдельное поле, куда запилить хэш всех полей каждой записи? (хотя минус наверно быстрее будет)
...
Рейтинг: 0 / 0
17.02.2017, 12:33
    #39406481
Olga.IOVOVA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Добрый Э - Эх,

Все типы колонок поддерживаются оператором MINUS. Проблема заключается в объеме данных
...
Рейтинг: 0 / 0
17.02.2017, 12:54
    #39406500
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Olga.IOVOVA,

Чисто посмеяться :)
1. Выгрузить в две таблицы (create table as select).
2. Создать индекс на каждой по всем полям.
3. Select A natural join B
...
Рейтинг: 0 / 0
17.02.2017, 12:56
    #39406504
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Если нужно только определить, идентичны или нет, можно отсортировать наборы по одному критерию и сравнивать построчно (с помощью дихотомии). Это может быть быстрее.
...
Рейтинг: 0 / 0
17.02.2017, 12:56
    #39406505
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Olga.IOVOVAПроблема заключается в объеме данныхЕсли объем - это проблема, сделайте truncate.
...
Рейтинг: 0 / 0
17.02.2017, 12:59
    #39406508
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Olga.IOVOVAИмеется следующая задача - нужно сравнить два идентичных по структуре набора данных(2
среза одной таблицы). Нужно определить идентичны они или нет.

Решение: параллельный фетч из двух курсоров, отсортированных по первичному ключу,
сравнение полей и прерывание по несовпадению. Можно использовать full outer join если он
умеет использовать план merge.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.02.2017, 13:03
    #39406514
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Dimitry Sibiryakovпараллельный фетч из двух курсоров, отсортированных по первичному ключуосмелюсь предположить, что набор колонок, как и ключей, на момент сравнения неизвестен (походу, только динамика)
...
Рейтинг: 0 / 0
17.02.2017, 13:04
    #39406516
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Dimitry SibiryakovРешение: параллельный фетч из двух курсоров, отсортированных по первичному ключу,
сравнение полей и прерывание по несовпадению. Можно использовать full outer join если он
умеет использовать план merge.
Фетч куда?
На клиента? 500 млн?
На сервере? В цикле? Построчно или в коллекции?

Мда... Похоже я один тут minus-ами сравниваю.
...
Рейтинг: 0 / 0
17.02.2017, 13:06
    #39406518
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
AmKadФетч куда?

Туда, где будет производиться сравнение. PL/SQL блок - вполне подойдёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.02.2017, 13:09
    #39406520
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
AmKadПохоже я один тут minus-ами сравниваю.
Видимо да. Остальные предпочитают одно чтение данных вместо двух.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.02.2017, 13:13
    #39406529
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Тут надо таки решать не в общем виде, а как обычно бывает у ТС, как часто бывает разница и в чем именно
Если они в 99% случаях разные -- достаточно начать со сравнения кол-ва строк (ну или MINUS только первичных ключей) -- это решит больше половины сразу
Дальше, например, MINUS по каждому индексу (но тут засада, если индекс неуникальный)
...
Рейтинг: 0 / 0
17.02.2017, 13:42
    #39406565
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Dimitry SibiryakovВидимо да. Остальные предпочитают одно чтение данных вместо двух.
Ага, а такими мелочами, в своем варианте, как переключение контекста или hash join, ты пренебрег.
...
Рейтинг: 0 / 0
17.02.2017, 13:46
    #39406572
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
AmKadDimitry SibiryakovВидимо да. Остальные предпочитают одно чтение данных вместо двух.
Ага, а такими мелочами, в своем варианте, как переключение контекста или hash join, ты пренебрег.Ну или как ты пишешь merge-join, если удастся захинтовать.
...
Рейтинг: 0 / 0
17.02.2017, 14:08
    #39406603
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Для сравнения джоин не нужен. Достаточно отсортировать и независимо посчитать контрольные суммы пачками в параллель. При необходимости вычисления конкретной строки углубляться в расхожие пачки рекурсивно. В общем, заурядный дбмс_компарисон с точностью до предоставления ему "датасетов".
...
Рейтинг: 0 / 0
17.02.2017, 14:44
    #39406647
dbpatch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
Olga.IOVOVAДобрый день!

Имеется следующая задача - нужно сравнить два идентичных по структуре набора данных(2 среза одной таблицы). Нужно определить идентичны они или нет.
Количество строк может достигать 500 млн.


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

в качестве функции расчета можно использовать md5 (через PL/SQL обертку), можно ora_hash (что намного быстрее, но вероятность коллизии не 2^128, а 2^32, годится разве для девелоперских автотестов).

можно и через SHA-1 (примерно один порядок стоимости, в сравнении с md5, зато куда надежнее - вероятность коллизии 2^160)

http://stackoverflow.com/questions/1749753/making-a-sha1-hash-of-a-row-in-oracle


один минус - просто так складывать md5 или sha-1 суммы в number не получится - слишком много цифр. можно, впрочем, 39-ти цифровое значение делить на два, три числа через разбиение строк (SUBSTR) и складывать по-отдельности.

и вероятность коллизии тут будет что-то вроде 10^38

или написать свою библиотеку (на Java) для суммирования 128 битных или 160 битных цифр.

впрочем, про вероятности не буду заикаться, лень вспоминать теорвер.
...
Рейтинг: 0 / 0
17.02.2017, 14:59
    #39406669
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
dbpatchлень вспоминать теорвер.если не высокотехнологичный проект, критерия трех сигма будет достаточно
...
Рейтинг: 0 / 0
24.02.2017, 15:18
    #39409945
Сравнение двух датасетов
быстрее минуса только обрамленный минус, урезаный rownum'ом (+ переведенный в turbo-режим хинтом first_rows...)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
SQL> select count(*) from SALDO;

  COUNT(*)
----------
 227 742 077

Elapsed: 00:01:41.82
SQL> select count(*)  from (
  2  select *  from SALDO
  3  minus
  4  select * from SALDO@dblink
  5  );

  COUNT(*)
----------
 171 954 019

Elapsed: 00:29:48.05
SQL> /

  COUNT(*)
----------
 171 954 019

Elapsed: 00:26:14.14
SQL> /

  COUNT(*)
----------
 171 954 028

Elapsed: 00:25:51.81
SQL> l
  1  select count(*)  from (
  2  select *  from SALDO
  3  minus
  4  select * from SALDO@dblink
  5* )
SQL> c /.../) where rownum = 1
  5* ) where rownum = 1
SQL> /

  COUNT(*)
----------
         1

Elapsed: 00:18:48.97
SQL> /

  COUNT(*)
----------
         1

Elapsed: 00:18:45.01
SQL> /

  COUNT(*)
----------
         1

Elapsed: 00:18:25.26
SQL> 1
  1* select count(*)  from (
SQL> c !t !t /*+ first_rows(1) */  !
  1* select /*+ first_rows(1) */  count(*)  from (
SQL> /

  COUNT(*)
----------
         1

Elapsed: 00:18:00.81
SQL> /

  COUNT(*)
----------
         1

Elapsed: 00:18:58.22
SQL>



Хотя нужно помнить что весь TEMP будет съеден, и перед запуском убедиться что 2 размера таблицы не превышают его размер.
Я так таблицей на 5е8 положил обе тестовые базы...
...
Рейтинг: 0 / 0
24.02.2017, 20:46
    #39410044
ora601
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух датасетов
dbpatchсравнение двумя проходами можно сделать очень просто - посчитать контрольную сумму по строкам, затем сложить в пределах всех строк.

Имхо много не выиграешь, все равно нужно читать обе таблицы. Наверное можно написать функцию, где сначало отсечь по косвенным признакам типа min() max() по индексу первичного ключа и каунт, и если все совпадает то продолжить с вариантом фетча по первичному ключу до фейла (может даже в параллели). А вообще покупайте шардинг и екзадату)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сравнение двух датасетов / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]