обновлять запись БД каждый раз, когда я получаю ее из БД - это хорошая практика? - PullRequest
4 голосов
/ 19 августа 2011

Я использую сервер SQL, и у меня есть конкретная таблица, которая может содержать ~ 1 миллион ~ 10 миллионов записей максимум.

В каждой записи, которую я извлекаю, я делаю некоторые проверки (я запускаю несколько простых строк кода), а затем хочу отметить, что записи были проверены в DateTime.Now; поэтому я извлекаю запись, проверяю некоторые вещи, запускаю запрос на обновление, чтобы установить для поля last_checked_time значение DateTime.Now, а затем перехожу к следующей записи. Затем я могу получить все записи, упорядоченные по их полю 'last_checked_time' (по возрастанию), а затем перебрать их, упорядоченные по времени их проверки.

Это хорошая практика? Может ли он оставаться быстрым, пока у меня не более 10 миллионов записей в этой таблице?

Я где-то читал, что каждый запрос «обновления» на самом деле является удалением и созданием новой записи.

Я также хотел бы отметить, что эти записи будут часто получать мой сайт ASP.net.

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

Ответы [ 5 ]

2 голосов
/ 19 августа 2011

Если вам нужно это значение «последнего проверенного времени», тогда лучшее, наиболее эффективное место для его хранения - строка в таблице. Не имеет значения, сколько строк в таблице, каждое обновление будет влиять только на те строки, которые вы обновили.

Реализация обновления зависит от СУБД, но обычно это не делается путем удаления и повторной вставки строки.

1 голос
/ 19 августа 2011

Имеет смысл хранить «проверенное время» как часть строки, которую вы обновляете, а не в отдельном файле или даже в отдельной таблице в базе данных.Такой подход должен обеспечивать оптимальную производительность и помогать поддерживать согласованность.Решения, включающие более одной таблицы или внешних хранилищ данных, могут вводить требование для распределенных или многотабличных обновлений транзакций, которые включают значительную блокировку, что может негативно повлиять на производительность и значительно затруднить обеспечение согласованности.Стоит стремиться к решениям, которые минимизируют объем транзакций и, следовательно, блокируют.Кроме того, простота сама по себе является полезной целью.

1 голос
/ 19 августа 2011

Я бы порекомендовал извлечь ваши данные или часть данных, проверить все из них и отослать обновления обратно в транзакциях, чтобы база данных работала более эффективно. Это обеспечит меньшее количество поездок в оба конца.

Что касается того, является ли это хорошей практикой, я бы сказал, да, тем более что вы используете in в своих запросах. Определенно, не сохраняйте последнее проверенное время в файле и не пытайтесь сопоставить его после загрузки данных вашей базы данных. База данных RDBMS разработана, чтобы эффективно справиться с этим для вас. Не изобретай велосипед, используя кубики.

1 голос
/ 19 августа 2011

Возможно (просто возможно) вы могли бы создать новую таблицу, содержащую две строки: идентификатор строки в первой таблице и проверенную дату.

Таким образом, вы не измените исходную таблицу, но в зависимости от использования данных и даты проверки вы будете вынуждены сделать объединенный запрос, который, возможно, вам тоже не нужен. *

1 голос
/ 19 августа 2011

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

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