Поиск общих записей в двух очень больших таблицах базы данных - PullRequest
0 голосов
/ 10 июля 2011

У меня есть две очень большие таблицы, содержащие миллионы записей, и они содержат похожие записи. Таким образом, TableA может иметь другую структуру столбцов, чем TableB, для хранения одних и тех же данных, но и TableA, и TableB содержат столбец для уникального отпечатка записи. Каков наилучший способ узнать общие записи в Таблице A и Таблице B, которые содержат один и тот же отпечаток? Подобные вопросы задавались здесь несколько раз здесь, но здесь есть изменение.

Скажем, я храню pk общих записей в TableC(pk_a, pk_b, fingerprint), которые обозначают общий кортеж в TableA и TableB. Теперь TableC необходимо обновлять всякий раз, когда записи добавляются / удаляются из TableA или TableB.

Мое решение для первой части состоит в том, чтобы взять соединение TableA и TableB на идентичном отпечатке пальца и добавить его в TableC.

Для второй части запросите у TableC аналогичный отпечаток, а затем обновите TableC, если найдены какие-либо совпадения. Если совпадений не найдено, отсканируйте таблицу B (скажем, запись была добавлена ​​в таблицу B), чтобы найти отпечаток, а затем обновите TableC.

Но это довольно интуитивно и наивно. Я чувствую, что это можно сделать лучше.

Есть мысли у кого-нибудь?

1 Ответ

0 голосов
/ 10 июля 2011

Сначала я расскажу вам, как я вижу проблему:

  • Отпечаток пальца рассчитывается как функция одного из ключей таблицы (вероятно, ПК, также может быть кандидатом ПК).).Если нет, это не имеет смысла (* 1).Таким образом, отпечаток пальца является неизменным.
  • Кроме того, каждый отпечаток пальца является уникальным для каждой таблицы (большие проблемы, если это не так).
  • В идеале, я бы добавил отпечаток к каждой таблице какновый атрибут (NOT NULL UNIQUE), устанавливаемый триггером при создании строки.Если таблицы не слишком большие и функция не слишком интенсивно использует процессор, вы можете изменить это для функции БД, которая вычисляет отпечаток, который будет использоваться в выборках.
  • Если вы не можете изменить исходные таблицы, тонужна дополнительная таблица.Вы можете использовать только предложенную таблицу или одну таблицу для каждой из исходных таблиц (fingerprintA, pkA / fingerprintB, pkB).Ваше решение может быть быстрее, мое проще (только вставка / удаление, без обновлений) и более расширяемое (в случае, если таблица C появится завтра).Записи этой таблицы / таблиц / таблиц изменяются только путем вставки или удаления действий в исходных таблицах (в идеале через триггеры).
  • Как и в любой технике, более тонкие моменты проблемы (что вы ожидаете делать срешение и что вы можете сделать) склонить баланс к одному решению другого.

(* 1) Если вы можете изменить то, что ваша запись, изменив атрибут, который не является частьюПК, значит, ваша модель неверна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...