|
|
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Добрый день! Имеется следующая задача - нужно сравнить два идентичных по структуре набора данных(2 среза одной таблицы). Нужно определить идентичны они или нет. Количество строк может достигать 500 млн. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:11 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Olga.IOVOVA, minus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:14 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
AmKad, на таком объеме данных будет очень долго работать, а такие сравнения нужно сделать не для одной таблице ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:19 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Если найдете способ быстрее - скажите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:27 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
AmKad, ТС ничего не рассказал о структуре и составе своих срезов. Может там LONG-и, LOB-ы и прочие радости, неподдерживаемые оператором MINUS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:30 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
1. Может есть отдельные поля, которые заведомо дадут разницу, там id какие-нибудь? ) 2. В каждой таблице сделать отдельное поле, куда запилить хэш всех полей каждой записи? (хотя минус наверно быстрее будет) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:33 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Добрый Э - Эх, Все типы колонок поддерживаются оператором MINUS. Проблема заключается в объеме данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:33 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Olga.IOVOVA, Чисто посмеяться :) 1. Выгрузить в две таблицы (create table as select). 2. Создать индекс на каждой по всем полям. 3. Select A natural join B ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:54 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Если нужно только определить, идентичны или нет, можно отсортировать наборы по одному критерию и сравнивать построчно (с помощью дихотомии). Это может быть быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:56 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Olga.IOVOVAПроблема заключается в объеме данныхЕсли объем - это проблема, сделайте truncate. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:56 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Olga.IOVOVAИмеется следующая задача - нужно сравнить два идентичных по структуре набора данных(2 среза одной таблицы). Нужно определить идентичны они или нет. Решение: параллельный фетч из двух курсоров, отсортированных по первичному ключу, сравнение полей и прерывание по несовпадению. Можно использовать full outer join если он умеет использовать план merge. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 12:59 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovпараллельный фетч из двух курсоров, отсортированных по первичному ключуосмелюсь предположить, что набор колонок, как и ключей, на момент сравнения неизвестен (походу, только динамика) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 13:03 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovРешение: параллельный фетч из двух курсоров, отсортированных по первичному ключу, сравнение полей и прерывание по несовпадению. Можно использовать full outer join если он умеет использовать план merge. Фетч куда? На клиента? 500 млн? На сервере? В цикле? Построчно или в коллекции? Мда... Похоже я один тут minus-ами сравниваю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 13:04 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
AmKadФетч куда? Туда, где будет производиться сравнение. PL/SQL блок - вполне подойдёт. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 13:06 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
AmKadПохоже я один тут minus-ами сравниваю. Видимо да. Остальные предпочитают одно чтение данных вместо двух. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 13:09 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Тут надо таки решать не в общем виде, а как обычно бывает у ТС, как часто бывает разница и в чем именно Если они в 99% случаях разные -- достаточно начать со сравнения кол-ва строк (ну или MINUS только первичных ключей) -- это решит больше половины сразу Дальше, например, MINUS по каждому индексу (но тут засада, если индекс неуникальный) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 13:13 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovВидимо да. Остальные предпочитают одно чтение данных вместо двух. Ага, а такими мелочами, в своем варианте, как переключение контекста или hash join, ты пренебрег. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 13:42 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
AmKadDimitry SibiryakovВидимо да. Остальные предпочитают одно чтение данных вместо двух. Ага, а такими мелочами, в своем варианте, как переключение контекста или hash join, ты пренебрег.Ну или как ты пишешь merge-join, если удастся захинтовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 13:46 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
Для сравнения джоин не нужен. Достаточно отсортировать и независимо посчитать контрольные суммы пачками в параллель. При необходимости вычисления конкретной строки углубляться в расхожие пачки рекурсивно. В общем, заурядный дбмс_компарисон с точностью до предоставления ему "датасетов". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 14:08 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
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.02.2017, 14:44 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
dbpatchлень вспоминать теорвер.если не высокотехнологичный проект, критерия трех сигма будет достаточно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2017, 14:59 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
быстрее минуса только обрамленный минус, урезаный 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. Хотя нужно помнить что весь TEMP будет съеден, и перед запуском убедиться что 2 размера таблицы не превышают его размер. Я так таблицей на 5е8 положил обе тестовые базы... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2017, 15:18 |
|
||
|
Сравнение двух датасетов
|
|||
|---|---|---|---|
|
#18+
dbpatchсравнение двумя проходами можно сделать очень просто - посчитать контрольную сумму по строкам, затем сложить в пределах всех строк. Имхо много не выиграешь, все равно нужно читать обе таблицы. Наверное можно написать функцию, где сначало отсечь по косвенным признакам типа min() max() по индексу первичного ключа и каунт, и если все совпадает то продолжить с вариантом фетча по первичному ключу до фейла (может даже в параллели). А вообще покупайте шардинг и екзадату) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2017, 20:46 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39410044&tid=1886372]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 459ms |

| 0 / 0 |
