Эффективный способ проверить строку большого числа, существующую в базе данных - PullRequest
1 голос
/ 10 апреля 2019

У меня очень большая таблица в базе данных, в таблице есть столбец «unique_code_string», эта таблица содержит почти 100 000 000 записей.

Каждые 2 минуты я получаю 100 000 строк кода, они находятся вмассив, и они уникальны друг для друга.Мне нужно вставить их в большой стол, если они все "хорошие".Значение «хорошо» таково: все 100 000 кодов в массиве никогда не встречаются в большой таблице базы данных.

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

В настоящее время я использую этот способ: сначала я делаю цикл и проверяю каждый код в массиве, чтобы увидеть, есть ли уже тот же код в базе данныхбольшой столВо-вторых, если весь код «новый», то я делаю настоящую вставку.Но этот путь очень медленный, я должен закончить все в течение 2 минут.

Я думаю о других способах:

  1. Присоединение 100 000 кода в SQL "впункт ", каждый код имеет длину 32, я думаю, что ни одна база данных не примет эту длину 32 * 100 000" в предложении ".

  2. Использовать транзакцию базы данных, я все равно принудительно вставляю коды, если произойдет ошибка, откат транзакции.Это может вызвать проблемы с производительностью.

  3. Использовать временную таблицу базы данных, я плохо умею писать запросы SQL, приведите пример, если эта идея может сработать.

Теперь, какие-нибудь эксперты могут дать мне какой-нибудь совет или некоторые решения?

Я не говорящий по-английски, надеюсь, вы видите проблему, с которой я сталкиваюсь.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 10 апреля 2019

Загрузите 100 000 строк в таблицу!

Создайте уникальный индекс на исходной таблице:

create unique index unq_bigtable_uniquecodestring on bigtable (unique_code_string);

Теперь у вас есть необходимые инструменты.Я думаю, что я бы пошел на транзакцию, что-то вроде этого:

insert into bigtable ( . . . )
    select . . . 
    from smalltable;

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

insert into bigtable ( . . . )
    select . . . 
    from smalltable
    where not exists (select 1
                      from smalltable st join
                           bigtable bt
                           on st.unique_code_string = bt.unique_code_string
                      );

Для этой версии у вас также должно быть ограничение индекса / уникальности для smalltable(unique_code_string).

0 голосов
/ 10 апреля 2019

Трудно найти оптимальное решение с таким небольшим количеством информации.Часто это зависит от задержки в сети между приложением и сервером базы данных, а также аппаратными ресурсами.

  1. Вы можете загрузить 100 000 000 unique_code_string из базы данных и использовать HashSet или TreeSet для удаления дубликатов в памяти перед вставкой в ​​базу данных.Если ваш сервер базы данных ограничен в ресурсах или имеется значительная задержка в сети, это может быть быстрее.

  2. В зависимости от того, как вы получите дельту в 100 000 записей, вы можете загрузить ее в базу данных, например, файл CSV можетчитать с использованием внешней таблицы .Если вы можете эффективно переносить данные во временную таблицу и сервер базы данных не перегружен, вы можете сделать это очень эффективно с помощью SQL или хранимой процедуры.

Вам следует потратить некоторое время, чтобы понять, насколько реальновремя обновления должно быть, например, сколько запросов SQL считывает таблицу строк на 100 000 000, и можно ли разрешить отмену или блокировку некоторых из этих запросов SQL во время обновления строк.Часто рекомендуется создать теневую таблицу:

  • Создать новую таблицу как копию существующей таблицы 100 000 000 строк.
  • Отключить индексы для новой таблицы
  • Загрузить дельта-строки в новую таблицу
  • Перестроить индексы для новой таблицы
  • Удалить существующую таблицу
  • Переименовать новую таблицу в существующую таблицу 100 000 000 строк

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

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