вторник, 25 января 2022 г.

Ускорение работы Database Mail

 В данной небольшой статье хочу описать ускорение работы 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 нужно обслуживать.

.



Комментариев нет :

Отправить комментарий