Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Сравнение двух датасетов  [new]
Olga.IOVOVA
Member

Откуда:
Сообщений: 44
Добрый день!

Имеется следующая задача - нужно сравнить два идентичных по структуре набора данных(2 среза одной таблицы). Нужно определить идентичны они или нет.
Количество строк может достигать 500 млн.
17 фев 17, 12:11    [20220735]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
AmKad
Member

Откуда:
Сообщений: 4319
Olga.IOVOVA,

minus
17 фев 17, 12:14    [20220752]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
Olga.IOVOVA
Member

Откуда:
Сообщений: 44
AmKad,

на таком объеме данных будет очень долго работать, а такие сравнения нужно сделать не для одной таблице
17 фев 17, 12:19    [20220776]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
AmKad
Member

Откуда:
Сообщений: 4319
Если найдете способ быстрее - скажите.
17 фев 17, 12:27    [20220813]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
Добрый Э - Эх
Guest
AmKad,

ТС ничего не рассказал о структуре и составе своих срезов. Может там LONG-и, LOB-ы и прочие радости, неподдерживаемые оператором MINUS.
17 фев 17, 12:30    [20220827]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
Авдруг
Guest
1. Может есть отдельные поля, которые заведомо дадут разницу, там id какие-нибудь? )
2. В каждой таблице сделать отдельное поле, куда запилить хэш всех полей каждой записи? (хотя минус наверно быстрее будет)
17 фев 17, 12:33    [20220838]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
Olga.IOVOVA
Member

Откуда:
Сообщений: 44
Добрый Э - Эх,

Все типы колонок поддерживаются оператором MINUS. Проблема заключается в объеме данных
17 фев 17, 12:33    [20220841]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
--Eugene--
Member

Откуда: Санкт-Петербург
Сообщений: 1897
Olga.IOVOVA,

Чисто посмеяться :)
1. Выгрузить в две таблицы (create table as select).
2. Создать индекс на каждой по всем полям.
3. Select A natural join B
17 фев 17, 12:54    [20220930]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
Alibek B.
Member

Откуда:
Сообщений: 2208
Если нужно только определить, идентичны или нет, можно отсортировать наборы по одному критерию и сравнивать построчно (с помощью дихотомии). Это может быть быстрее.
17 фев 17, 12:56    [20220938]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
AmKad
Member

Откуда:
Сообщений: 4319
Olga.IOVOVA
Проблема заключается в объеме данных
Если объем - это проблема, сделайте truncate.
17 фев 17, 12:56    [20220939]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 42676

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

Решение: параллельный фетч из двух курсоров, отсортированных по первичному ключу,
сравнение полей и прерывание по несовпадению. Можно использовать full outer join если он
умеет использовать план merge.

Posted via ActualForum NNTP Server 1.5

17 фев 17, 12:59    [20220949]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
--Eugene--
Member

Откуда: Санкт-Петербург
Сообщений: 1897
Dimitry Sibiryakov
параллельный фетч из двух курсоров, отсортированных по первичному ключу
осмелюсь предположить, что набор колонок, как и ключей, на момент сравнения неизвестен (походу, только динамика)
17 фев 17, 13:03    [20220968]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
AmKad
Member

Откуда:
Сообщений: 4319
Dimitry Sibiryakov
Решение: параллельный фетч из двух курсоров, отсортированных по первичному ключу,
сравнение полей и прерывание по несовпадению. Можно использовать full outer join если он
умеет использовать план merge.
Фетч куда?
На клиента? 500 млн?
На сервере? В цикле? Построчно или в коллекции?

Мда... Похоже я один тут minus-ами сравниваю.
17 фев 17, 13:04    [20220974]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 42676

AmKad
Фетч куда?

Туда, где будет производиться сравнение. PL/SQL блок - вполне подойдёт.

Posted via ActualForum NNTP Server 1.5

17 фев 17, 13:06    [20220986]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 42676

AmKad
Похоже я один тут minus-ами сравниваю.

Видимо да. Остальные предпочитают одно чтение данных вместо двух.

Posted via ActualForum NNTP Server 1.5

17 фев 17, 13:09    [20220997]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 17020
Тут надо таки решать не в общем виде, а как обычно бывает у ТС, как часто бывает разница и в чем именно
Если они в 99% случаях разные -- достаточно начать со сравнения кол-ва строк (ну или MINUS только первичных ключей) -- это решит больше половины сразу
Дальше, например, MINUS по каждому индексу (но тут засада, если индекс неуникальный)
17 фев 17, 13:13    [20221013]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
AmKad
Member

Откуда:
Сообщений: 4319
Dimitry Sibiryakov
Видимо да. Остальные предпочитают одно чтение данных вместо двух.
Ага, а такими мелочами, в своем варианте, как переключение контекста или hash join, ты пренебрег.
17 фев 17, 13:42    [20221138]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
AmKad
Member

Откуда:
Сообщений: 4319
AmKad
Dimitry Sibiryakov
Видимо да. Остальные предпочитают одно чтение данных вместо двух.
Ага, а такими мелочами, в своем варианте, как переключение контекста или hash join, ты пренебрег.
Ну или как ты пишешь merge-join, если удастся захинтовать.
17 фев 17, 13:46    [20221153]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
-2-
Member

Откуда:
Сообщений: 12843
Для сравнения джоин не нужен. Достаточно отсортировать и независимо посчитать контрольные суммы пачками в параллель. При необходимости вычисления конкретной строки углубляться в расхожие пачки рекурсивно. В общем, заурядный дбмс_компарисон с точностью до предоставления ему "датасетов".
17 фев 17, 14:08    [20221272]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
dbpatch
Member

Откуда:
Сообщений: 123
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 битных цифр.

впрочем, про вероятности не буду заикаться, лень вспоминать теорвер.
17 фев 17, 14:44    [20221483]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
--Eugene--
Member

Откуда: Санкт-Петербург
Сообщений: 1897
dbpatch
лень вспоминать теорвер.
если не высокотехнологичный проект, критерия трех сигма будет достаточно
17 фев 17, 14:59    [20221559]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
Резус-фактор
Guest
быстрее минуса только обрамленный минус, урезаный rownum'ом (+ переведенный в turbo-режим хинтом first_rows...)

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 положил обе тестовые базы...
24 фев 17, 15:18    [20241684]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение двух датасетов  [new]
ora601
Member

Откуда:
Сообщений: 684
dbpatch
сравнение двумя проходами можно сделать очень просто - посчитать контрольную сумму по строкам, затем сложить в пределах всех строк.


Имхо много не выиграешь, все равно нужно читать обе таблицы. Наверное можно написать функцию, где сначало отсечь по косвенным признакам типа min() max() по индексу первичного ключа и каунт, и если все совпадает то продолжить с вариантом фетча по первичному ключу до фейла (может даже в параллели). А вообще покупайте шардинг и екзадату)
24 фев 17, 20:46    [20242175]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить