Записать с помощью SQL Server Profiler (или AnjLab.SqlProfiler) запросы, исполняемые при запуске функции (например редактирование анкеты)
Добавить метки времени в начало и в конец запроса CONVERT(nvarchar(30), GETDATE(), 126)
Запустить скрипт на локальном сервере и на сервере разработчика
Вычислить времени выполнения на локальном сервере и на сервере разработчика (ручным способом)/ Результаты позволяют уверенно говорить о причинах медленной загрузки страниц (например редактирование анкеты) в браузере.
Max Degree of Parallelism - задает максимальное количество потоков, которые могут быть выделены каждому запросу (по умолчанию стоит 0-ограничение только самой операционной системой и редакцией MS SQL Server)
Cost Threshold for Parallelism - оценочная стоимость параллелизма (по умолчанию стоит 5)
Max DOP - задает максимальное количество потоков, которые могут быть выделены каждому запросу на уровне базы данных (но не более, чем значение свойства «Max Degree of Parallelism») (по умолчанию стоит 0-ограничение только самой операционной системой и редакцией MS SQL Server, а также ограничение по свойству «Max Degree of Parallelism» всего экземпляра MS SQL Server)
Для выявления нехватки процессорного времени достаточно воспользоваться системным представлением sys.dm_os_schedulers.
показатель runnable_tasks_count постоянно больше 1, то существует большая вероятность того, что количество ядер не хватает экземпляру MS SQL Server.
select max([runnable_tasks_count]) as [runnable_tasks_count] from sys.dm_os_schedulers where scheduler_id<255;
алгоритм действий для OLTP-систем для настройки свойств параллелизма:
сначала запретить параллелизм, выставив на уровне всего экземпляра Max Degree of Parallelism в 1
проанализировать самые тяжелые запросы и подобрать для них оптимальное количество потоков
выставить Max Degree of Parallelism в подобранное оптимальное количество потоков, полученное из п.2, а также для конкретных баз данных выставить Max DOP значение, полученное из п.2 для каждой базы данных
проанализировать самые тяжелые запросы и выявить негативный эффект от многопоточности. Если он есть, то повышать Cost Threshold for Parallelism.
I set the Maximum Degree of Parallelism to 2, which means the query still uses parallelism but only on 2 CPUs.
However, I keep the Cost Threshold for Parallelism very high. This way, not all the queries will qualify for parallelism but only the query with higher cost will go for parallelism. I have found this to work best for a system that has OLTP queries and also where the reporting server is set up.