Лучшая практика для проверки наличия данных в базе данных в цикле? - PullRequest
0 голосов
/ 27 января 2011

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

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

Есть ли лучшая практика для выполнения таких задач?

Ответы [ 2 ]

1 голос
/ 27 января 2011

Как вы проверяете наличие записи в вашей таблице базы данных?Скорее всего, вы сравниваете его с локальным идентификатором или чем-то подобным.

Если это так, то я бы запросил таблицу и выбрал все идентификаторы, сохранив их в Hashtable (Dictionary в .Net).(Это может быть непрактично, если ваша база данных содержит миллионы записей).Чтобы определить, существует ли запись в таблице сейчас, достаточно просто проверить, существует ли ключ в словаре, что является операцией O (log n) и поэтому намного лучше, чем O (n) дорогостоящие обходы базы данных.

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

В простом случае, когда нет возможных дубликатов, просто добавьте их в словарь по соответствующему ключу, а затем выполните запрос Dictionary.Values, который равен O (1), вероятно, так же быстро, как и получится.Если вам нужно, чтобы вставки были действительно быстрыми, потому что они массивные, рассмотрите возможность использования SQL Bulk Inserts.

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

Если ваша СУБД реализует команду SQL Merge (при условии, что вы используете MS SQL Server, это так), я бывставьте все данные во временную таблицу, а затем объедините ее с целевой таблицей.Это, вероятно, самое быстрое решение.

0 голосов
/ 27 января 2011

Сколько данных и какая реализация SQL могут иметь здесь большое значение ...

Например, с 10 миллионами строк данных, выполняющими 10 миллионов (потенциально зарегистрированных) операций, одна для каждой строки займет на несколько порядков больше, чем, например:

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