В данной небольшой статье хочу описать ускорение работы Database mail компонента SQL Server.
В конец месяца, года обычно делается массовая рассылка из систем: клиентам банка отчеты , к примеру годовые налоги или финансовые отчеты, в торговых компаниях отчеты контрагентам и так далее.
Большинство этих отчетов выглядят как письма с вложенными файлами. Вот тут и всплывает небольшая проблема, которая может возникнуть в работе Database Mail.
Как пример, на одном из финансовых сервере баз данных создалась очередь отправки писем с вложенными файлами примерно 300000 клиентам. Скорость отправки была примерно 6000 тысяч файлов в час, что очень медленно и при том новые письма на отправку постоянно создаются. Это могло вылится в проблему в несколько дней.
При изучение, было замечено что процесс Database mail сканирует таблицу -кучу в msdb.sysmail_attachments.
Это куча, в моем состоянии она весила 250Гб и для каждого письма происходило сканирование данной кучи. Логично создать индекс:
USE [msdb]
GO
CREATE NONCLUSTERED INDEX [INDX_mailitem_id] ON [dbo].[sysmail_attachments]
(
[mailitem_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
После создания индекса план запросов был следующий:
после этого количество сессий Database mai увеличилось с одного до 50
Ниже статистика отсылки писем до создания индекса и после:
Результат на лицо вместо 60-90 писем в минуту до 3000 писем в минуту.
В итоге очередь из сотни тысяч писем была разослана за несколько десятков минут.
Почему изначально данного индекса нет- возможно не предполагалась такая нагрузка на почтовый агент.
В любому случае индекс не стал лишнем, но так же не забываем, что системную бд msdb нужно обслуживать.
.
Комментариев нет :
Отправить комментарий