Самый быстрый способ обновить всю статистику в базе данных? - PullRequest
0 голосов
/ 22 октября 2018

Итак, я хочу запустить статистику обновлений для всех таблиц в моей базе данных.Одним из ограничений является то, что я не могу запустить статистику обновлений более чем для 20 статистических таблиц одновременно.Например, если таблица A имеет 40 статистических данных, я должен разбить это на 2 оператора статистики обновлений.Это потому, что некоторые из этих таблиц действительно большие, и приложение, над которым я работаю, имеет тайм-аут на вызовы базы данных.

Я пытался распараллелить этот процесс.Во-первых, я попытался создать задания с максимум 20 таблицами статистики на блок и используя parallel.foreach.Однако я заметил, хотя я установил maxDegreeOfParallelism на 5, часто в моей базе данных одновременно выполнялось только 3 запроса.Я читал о том, как parallel.foreach делает некоторые вещи с разделением / разделением ресурсов между потоками, но я не чувствую, что есть причина использовать это, если я просто делаю один вызов базы данных для каждой задачи.

Затем я попытался создать задачи и ограничить число активных задач с помощью семафоров.Используя то же ограничение в 5 задач, я смог увидеть 5 запросов, выполняющихся одновременно в базе данных, но в целом не заметил большого выигрыша в производительности по сравнению с использованием parallel.foreach.

Теперь мне действительно интересно, какскорость этого процесса масштабируется с числом бегущих Update Statistics.Некоторые вещи я заметил, но могу ошибаться.Всякий раз, когда я пытаюсь запустить два Update statistics одновременно на одной и той же таблице

--assume these are running in different tasks
Update Statistics A (stattable1, stattable2,....stattable20);
Update Statistics A (stattable21, stattable22....);

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

Затем при одновременном запуске Update Statistics на двух разных таблицах

--assume these are running in different tasks
Update Statistics A (stattable1, stattable2,....);
Update Statistics B (stattable1, stattable2....);

Я замечаю, что каждый запрос занимает больше времени, чем если бы я просто запускал одно обновление за раз, однако этозадержка, по-видимому, не полностью блокируется (т. е. если Update Statistics A занимает 2 минуты, а Update Statistics B занимает 2 минуты, то для того, чтобы они оба закончили, может потребоваться 3 минуты, а не 4).Это то, в чем я действительно не уверен, как эта производительность масштабируется, когда вы выполняете больше запросов параллельно.

По сути, мне просто интересно, имеет ли смысл использовать задачи по сравнению с параллельными.foreach, а также лучшиеспособ структурирования этих запросов для повышения производительности.

...