#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. Вам придется жестко кодировать , чтобы обойти запрос к базе данных (например, с опцией параллельного), и не забывайте, что таблицы не обязательно должны соответствовать вашей памяти, поэтому вам следует быть более осторожным с утверждением.