Приложение запросов C# DB заставляет сервер БД перестать отвечать: Какие инструменты я могу использовать на сервере БД для определения и изучения точки дросселирования?

Я написал программу по образцу принятого ответа для асинхронных задач регулирования. Смотрите код ниже. Моя программа по сути является специальным инструментом "текстового поиска" БД. Он работает на клиентской машине Win 7. Программа составляет большую коллекцию SELECT операторов (от сотен до тысяч) и отправляет их на удаленный сервер БД (клиент Win 7 и сервер БД находятся в одном домене AD. read-onlysecondary сервер в Always On Availability Group). Каждый вызов Download метод создает 1-ко-многим SELECT запрашивает (один SELECT на каждый столбец таблицы) для одной таблицы БД. Download Метод вызывается от 1 до тысяч раз (один раз для каждой таблицы, в которой выполняется поиск).

TPL Dataflow работает хорошо, пока я ограничиваю поиск не более 60-70 таблицами. Более того, и это душит (я думаю) SQL Server Database и / или серверная машина БД. Я играл с различными MaxDegreeOfParallelism а также BoundedCapacity значения в попытке контролировать клиента. С MaxDegreeOfParallelism = 8 (количество процессоров на моем клиентском компьютере, я вижу, что CPU и DISK привязаны на компьютере сервера БД. MaxDegreeOfParallelism = 1 а также BoundedCapacity = 1, CPU и DISK в порядке на компьютере с сервером БД, но в процессе отправки запросов моя база данных прочитала код:

SqlDataReader sqlDataReader = await sqlCommand.ExecuteReaderAsync();
dataTable_TableDataFromFieldQuery.Load(sqlDataReader);

в конечном итоге выдает исключение "server has become unresponsive"

Какие инструменты я могу использовать на сервере БД для определения точки дросселирования? Даже если предположить, что мне нужно улучшить свои запросы, что мне искать и где?

Код из другого вопроса SO изменен для моего использования

var downloader = new TransformBlock<string, DataTable>(tableName => Download(tableName), new ExecutionDataflowBlockOptions {MaxDegreeOfParallelism={various values 1-5, BoundedCapacity={various values 1-5} } );

var buffer = new BufferBlock<DataTable>();
downloader.LinkTo(buffer);

foreach(var tableName in tableNames)
    await downloader.SendAsync(tableName);

downloader.Complete();
await downloader.Completion;

IList<DataTable> responses;

if (buffer.TryReceiveAll(out responses))
{
    //process all DataTables
}

1 ответ

Решение

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

Во-первых, SQL Server Profiler

Microsoft SQL Server Profiler - это графический пользовательский интерфейс для трассировки SQL для мониторинга экземпляра компонента Database Engine или служб Analysis Services. Вы можете собирать и сохранять данные о каждом событии в файл или таблицу для последующего анализа. Например, вы можете отслеживать производственную среду, чтобы увидеть, какие хранимые процедуры влияют на производительность, выполняя слишком медленно

И советник по настройке ядра СУБД

Советник по настройке ядра СУБД Microsoft (DTA) анализирует базы данных и дает рекомендации, которые можно использовать для оптимизации производительности запросов. Вы можете использовать помощник по настройке ядра СУБД для выбора и создания оптимального набора индексов, индексированных представлений или разделов таблиц без экспертного понимания структуры базы данных или внутренних компонентов SQL Server.

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

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

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

Другие вопросы по тегам