SqlBulkCopy *VERY* медленно в Azure Sql и C#
Я вставляю записи в sql используя SqlBulkCopy и FastMember
Локально я могу вставить 100 тысяч записей за 2 секунды. Когда я запускаю это для веб-задания веб-приложения Azure и базы данных Azure Sql, это занимает более 10 минут и время транзакции истекает. Определение таблицы такое же, аналогичные объемы данных в таблице и т. Д. Блокировок нет, просто медленно. Когда я запускаю его локально и пытаюсь записать в базу данных Azure Sql, это также занимает> 10 минут.
Фактический вызов настолько прост, насколько это возможно:
using(var bulkCopy = new SqlBulkCopy(connection){DestinationTableName="Table")
using(var reader = ObjectReader.Create(entities, columnList)
{
await bulkCopy.WriteToServerAsync(reader).ConfigureAwait(false);
}
Я пытался удалить транзакцию, используя TransactionScope(Suppress)
но это не имеет значения.
Может ли кто-нибудь помочь мне сообщить мне, какую глупую ошибку я совершил, или подсказать, как это диагностировать? Это действительно расстраивает! Разница во времени настолько велика, что я уверен, что здесь что-то упустил.
2 ответа
Что ж. Я удалил все индексы, и это имело какое-то значение, но партия все еще не вышла на 10 минут. Я удалил внешнюю объемную транзакцию (вместо того, чтобы использовать TransactionScope.Suppress
) и внезапно времена снова выглядят "нормальными". Процесс вставки занимает около 50 секунд, и он приближается к максимальному значению DTU во время работы, тогда как раньше он составлял всего около 20%.
Я до сих пор не знаю, почему он работает локально в 2 с с помощью транзакции окружения, но это должен быть один, чтобы записать, чтобы испытать
Спасибо всем, кто ответил - и, по крайней мере, указал мне хорошее направление для обучения!
Вы можете выполнить приведенный ниже запрос, чтобы проверить, существует ли высокий процент записи в журнале во время выполнения этой рабочей нагрузки:
SELECT
(COUNT(end_time) - SUM(CASE WHEN avg_cpu_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'CPU Fit Percent'
,(COUNT(end_time) - SUM(CASE WHEN avg_log_write_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Log Write Fit Percent'
,(COUNT(end_time) - SUM(CASE WHEN avg_data_io_percent > 80 THEN 1 ELSE 0 END) * 1.0) / COUNT(end_time) AS 'Physical Data Read Fit Percent'
FROM sys.dm_db_resource_stats
Вы также можете собирать ожидания, связанные с этой рабочей нагрузкой, используя один из различных методов, описанных в этой статье. Вы, вероятно, увидите высокие ожидания ввода-вывода во время выполнения этой рабочей нагрузки.
Чтобы избежать удушения во время выполнения интенсивных рабочих нагрузок с высоким вводом-выводом, вы можете масштабировать их перед запуском и уменьшать до исходного уровня после завершения рабочей нагрузки.
ALTER DATABASE [db1] MODIFY (EDITION = 'Premium', SERVICE_OBJECTIVE = 'P15');