Быстрее ли сравнивать две таблицы, импортируя их в базу данных sql или используя jdbc?

#sql #database #jdbc #diff #system-design

Вопрос:

Фон

Мне нужно сравнить две таблицы в двух разных центрах обработки данных, чтобы убедиться, что они одинаковые. Таблицы могут содержать сотни миллионов, даже миллиард строк.

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

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

Вот пример ввода и вывода:

Ввод

 table1:
Name | Age |
Alice| 25.0|
Bob  | 49  |
Jim  | 45  |
Cal  | 52  |

table2:
Name | Age |
Bob  | 49  |
Cal  | 42  |
Alice| 25  |
 

Выход:

 table1 missing rows (empty):
Name | Age |
     |     |

table2 missing rows:
Name | Age |
Jim  | 45  |

mismatching rows:
Name | Age | table |
Alice| 25.0| table1|
Alice| 25  | table2|
Cal  | 52  | table1|
Cal  | 42  | table2|
 

Примечание: Вывод не обязательно должен быть точно таким же, как в приведенном выше формате, но он должен содержать ту же информацию.

Вопрос

Быстрее ли импортировать эти таблицы в новую общую среду SQL, а затем использовать SQL для получения желаемого результата?

или

Быстрее ли использовать что-то вроде JDBC, извлекать все строки для каждой таблицы, сортировать каждую таблицу, а затем сравнивать их построчно, чтобы получить желаемый результат?

Правки:

Вышеуказанные решения будут выполняться в центре обработки данных, в котором размещена одна из таблиц. В первом решении единственной целью создания новой базы данных было бы сравнение этих таблиц с помощью SQL, других применений нет.

Комментарии:

1. Вам действительно нужно протестировать свои данные в вашей среде. Вам нужно определить, что вы подразумеваете под «сравнением» (например, «1,00» совпадает с «1»?). Есть ли у вас какое — либо другое использование базы данных? Находится ли он на более мощном сервере?

2. Сейчас я редактирую вопрос. Спасибо за ваш вклад

Ответ №1:

Вы должны окончательно начать с опции базы данных. Особенно если базы данных подключены с помощью ссылки на базу данных, вы можете легко настроить передачу данных.

Такое сравнение часто приводит к одному full outer join из двух источников, и опыт показывает нам, что соединения DIY, как известно, менее эффективны, чем реализация собственной базы данных (вы можете развернуть, например, параллельный вариант).

В любом случае вы можете попытаться реализовать какой-нибудь упрощенный алгоритм, который может выполнить сравнение без необходимости переноса всей таблицы.

Пример основан на деревьях Меркла, где вы сначала сканируете оба источника в их местоположении, чтобы определить, какие части идентичны (это можно игнорировать), а затем переносите и сравниваете только ту сторону, которая отличается.

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

Ответ №2:

Более быстрое решение-загрузить обе таблицы в переменные (память) на вашем языке программирования, а затем сравнить их с вашим любимым алгоритмом.

Копирование их сначала в новую таблицу занимает более чем вдвое больше времени при операциях чтения/записи на диск, особенно при записи.

Комментарии:

1. Вам придется жестко кодировать , чтобы обойти запрос к базе данных (например, с опцией параллельного), и не забывайте, что таблицы не обязательно должны соответствовать вашей памяти, поэтому вам следует быть более осторожным с утверждением.