Мы используем таблицу для почтовой очереди. Когда нужно отправить новое письмо, оно вставляется в эту таблицу. В таблице есть поле с именем status и индексом.

Сценарий запускается каждые 10 секунд и проверяет, есть ли новое письмо со статусом = 0, отправляет это письмо и затем обновляет статус до 1 (фактический почтовый контент сохраняется в виде столбца nvarchar(max)).

Мой вопрос: есть ли польза от немедленной «очистки» таблицы, то есть после отправки электронного письма скопировать запись в другую «отправленную» таблицу и удалить ее из таблицы почтовой очереди? Прямо сейчас мы выполняем этот процесс очистки только один раз в месяц, удаляя около 500 000 электронных писем каждый месяц.

0
user1480192 28 Май 2017 в 07:56

2 ответа

Лучший ответ

Вы должны рассмотреть выполнение нескольких операций здесь:

  • выбирает электронные письма для отправки
  • вставки новых писем
  • обновления отправленных писем
  • удаление отправленных писем

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

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

Обновление флага «отправлено» - самая сложная часть здесь. Размер таблицы играет большую роль, потому что сначала вам нужно выбрать строки с новыми электронными письмами, а затем обновить строку, как только вы ее отправите. Я предполагаю, что вы используете курсор для отправки писем по очереди в цикле, поэтому все, что вам нужно, - это всего лишь один оператор select, чтобы найти идентификаторы всех отправляемых элементов. Это не должно потреблять ресурсов, если у вас есть некластеризованный индекс в столбце флага. Вы должны помнить, чтобы поддерживать индекс, но об этом можно позаботиться в нерабочее время. После того, как вы отправили электронное письмо, чтобы обновить флаг, вы можете получить доступ к строке, используя ее идентификатор, поэтому, если у вас есть кластеризованный индекс в поле идентификатора (что, я надеюсь, так), это быстрая операция. ,

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

1
PacoDePaco 29 Май 2017 в 09:36

Если 10 секунд - это оправданное время для запуска вашего сценария, а объем почты много, то ваши действия правильные. Поскольку отправка почты очень важна, чем очистка таблицы.

Процесс очистки требует Выбрать -Вставить, выбрать -Удалить

Поскольку вы говорите 5 000 000 записей в месяц. Это означает, что вы отправляете столько почты в месяц. так за 10 секунд почты =

выберите 500000/30, выберите 16666 / (24 * 60 * 60.0) * 10 = 2 почтовых адреса.

Таким образом, вы отправляете 2 письма в 10 секунд.

Я думаю, что вы можете сделать все операции за один раз. Как триггер записи, чтобы переместить данные в архив при обновлении Status = 1.

Нет необходимости во втором планировщике.

0
KumarHarsh 29 Май 2017 в 10:38