Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом разделе показано, как создать и проверить определяемую пользователем функцию классификатора (UDF). Шаги включают выполнение инструкций Transact-SQL в редакторе запросов SQL Server Management Studio.
Пример, показанный в следующей процедуре, иллюстрирует возможности создания довольно сложной определяемой пользователем функции классификатора.
В нашем примере:
Пул ресурсов (pProductionProcessing) и группа рабочих нагрузок (gProductionProcessing) создаются для рабочей обработки в течение указанного диапазона времени.
Пул ресурсов (pOffHoursProcessing) и группа рабочих нагрузок (gOffHoursProcessing) создаются для обработки подключений, которые не соответствуют требованиям к рабочей обработке.
Таблица (TblClassificationTimeTable) создается в мастере для хранения времени начала и окончания, которые можно оценить по времени входа. Это необходимо создать в главном приложении, так как регулятор ресурсов использует привязку схемы для функций классификатора.
Замечание
Рекомендуется не хранить большие, часто обновляемые таблицы в главном хранилище.
Функция классификатора расширяет время входа. Слишком сложная функция может привести к превышению времени ожидания входа или замедлению быстрых подключений.
Создание определяемой пользователем функции классификатора
Создайте и настройте новые пулы ресурсов и группы рабочих нагрузок. Назначьте каждую группу рабочей нагрузки соответствующему пулу ресурсов.
--- Create a resource pool for production processing --- and set limits. USE master GO CREATE RESOURCE POOL pProductionProcessing WITH ( MAX_CPU_PERCENT = 100, MIN_CPU_PERCENT = 50 ) GO --- Create a workload group for production processing --- and configure the relative importance. CREATE WORKLOAD GROUP gProductionProcessing WITH ( IMPORTANCE = MEDIUM ) --- Assign the workload group to the production processing --- resource pool. USING pProductionProcessing GO --- Create a resource pool for off-hours processing --- and set limits. CREATE RESOURCE POOL pOffHoursProcessing WITH ( MAX_CPU_PERCENT = 50, MIN_CPU_PERCENT = 0 ) GO --- Create a workload group for off-hours processing --- and configure the relative importance. CREATE WORKLOAD GROUP gOffHoursProcessing WITH ( IMPORTANCE = LOW ) --- Assign the workload group to the off-hours processing --- resource pool. USING pOffHoursProcessing GO
Обновите конфигурацию в памяти.
ALTER RESOURCE GOVERNOR RECONFIGURE GO
Создайте таблицу и определите время начала и окончания для диапазона времени обработки рабочей среды.
USE master GO CREATE TABLE tblClassificationTimeTable ( strGroupName sysname not null, tStartTime time not null, tEndTime time not null ) GO --- Add time values that the classifier will use to --- determine the workload group for a session. INSERT into tblClassificationTimeTable VALUES('gProductionProcessing', '6:35 AM', '6:15 PM') go
Создайте функцию классификатора, которая использует функции времени и значения, которые можно оценить в сравнении со временем в таблице сопоставления. Сведения об использовании таблиц подстановки в функции классификатора, см. подраздел "Рекомендации по использованию таблиц подстановки в функции классификатора" в этом разделе.
Замечание
В SQL Server 2008 представлен расширенный набор типов данных и функций даты и времени. Дополнительные сведения см. в разделе "Типы данных даты и времени" и "Функции" (Transact-SQL).
CREATE FUNCTION fnTimeClassifier() RETURNS sysname WITH SCHEMABINDING AS BEGIN DECLARE @strGroup sysname DECLARE @loginTime time SET @loginTime = CONVERT(time,GETDATE()) SELECT TOP 1 @strGroup = strGroupName FROM dbo.tblClassificationTimeTable WHERE tStartTime <= @loginTime and tEndTime >= @loginTime IF(@strGroup is not null) BEGIN RETURN @strGroup END --- Use the default workload group if there is no match --- on the lookup. RETURN N'gOffHoursProcessing' END GO
Зарегистрируйте функцию классификатора и обновите конфигурацию в памяти.
ALTER RESOURCE GOVERNOR with (CLASSIFIER_FUNCTION = dbo.fnTimeClassifier) ALTER RESOURCE GOVERNOR RECONFIGURE GO
Проверка пулов ресурсов, групп рабочей нагрузки и определяемой пользователем функции классификатора
Получите конфигурацию пула ресурсов и группы рабочей нагрузки с помощью следующего запроса.
USE master SELECT * FROM sys.resource_governor_resource_pools SELECT * FROM sys.resource_governor_workload_groups GO
Убедитесь, что функция классификатора существует и включена с помощью следующих запросов.
--- Get the classifier function Id and state (enabled). SELECT * FROM sys.resource_governor_configuration GO --- Get the classifer function name and the name of the schema --- that it is bound to. SELECT object_schema_name(classifier_function_id) AS [schema_name], object_name(classifier_function_id) AS [function_name] FROM sys.dm_resource_governor_configuration
Получите текущие данные среды выполнения для пулов ресурсов и групп рабочих нагрузок с помощью следующего запроса.
SELECT * FROM sys.dm_resource_governor_resource_pools SELECT * FROM sys.dm_resource_governor_workload_groups GO
Узнайте, какие сеансы находятся в каждой группе, используя следующий запрос.
SELECT s.group_id, CAST(g.name as nvarchar(20)), s.session_id, s.login_time, CAST(s.host_name as nvarchar(20)), CAST(s.program_name AS nvarchar(20)) FROM sys.dm_exec_sessions s INNER JOIN sys.dm_resource_governor_workload_groups g ON g.group_id = s.group_id ORDER BY g.name GO
Узнайте, какие запросы находятся в каждой группе, используя следующий запрос.
SELECT r.group_id, g.name, r.status, r.session_id, r.request_id, r.start_time, r.command, r.sql_handle, t.text FROM sys.dm_exec_requests r INNER JOIN sys.dm_resource_governor_workload_groups g ON g.group_id = r.group_id CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t ORDER BY g.name GO
Узнайте, какие запросы выполняются в классификаторе, используя следующий запрос.
SELECT s.group_id, g.name, s.session_id, s.login_time, s.host_name, s.program_name FROM sys.dm_exec_sessions s INNER JOIN sys.dm_resource_governor_workload_groups g ON g.group_id = s.group_id AND 'preconnect' = s.status ORDER BY g.name GO SELECT r.group_id, g.name, r.status, r.session_id, r.request_id, r.start_time, r.command, r.sql_handle, t.text FROM sys.dm_exec_requests r INNER JOIN sys.dm_resource_governor_workload_groups g ON g.group_id = r.group_id AND 'preconnect' = r.status CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t ORDER BY g.name GO
Рекомендации по использованию таблиц Lookup в функции классификатора
Не пользуйтесь таблицей поиска, если в этом нет крайней необходимости. Если вам нужно использовать таблицу подстановки, ее можно жестко закодировать в саму функцию; однако это необходимо сбалансировать с сложностью и динамическими изменениями функции классификатора.
Ограничьте операции ввода-вывода для таблиц подстановки.
Используйте top 1, чтобы вернуть только одну строку.
Сведите к минимуму количество строк в таблице.
Сделайте все строки таблицы на одной странице или на небольшом числе страниц.
Убедитесь, что строки, найденные с помощью операций поиска индекса, используют как можно больше столбцов поиска.
Отмена нормализации в одну таблицу, если вы рассматриваете возможность использования нескольких таблиц с соединениями.
Запретить блокировку таблицы поиска.
NOLOCK
Используйте указание, чтобы предотвратить блокировку или использованиеSET LOCK_TIMEOUT
в функции с максимальным значением в 1000 миллисекундах.Таблицы должны существовать в базе данных master. (База данных master является единственной базой данных, которая гарантированно будет восстановлена при попытке подключения клиентских компьютеров).
Всегда полностью квалифицируйте имя таблицы со схемой. Имя базы данных не требуется, так как она должна быть основной базой данных.
Триггеры в таблице отсутствуют.
Если вы обновляете содержимое таблицы, обязательно используйте транзакцию уровня изоляции моментальных снимков, чтобы предотвратить блокировку операций чтения. Обратите внимание, что использование подсказки
NOLOCK
также должно исправить это.Если это возможно, отключите функцию классификатора при изменении содержимого таблицы.
Предупреждение
Мы настоятельно рекомендуем следовать этим рекомендациям. Если возникают проблемы, которые не позволяют выполнять рекомендации, рекомендуется обратиться в службу поддержки Майкрософт, чтобы упреждающее предотвратить любые будущие проблемы.
См. также
регулятор ресурсов
Включение регулятора ресурсов
Пул ресурсов регулятора ресурсов
Группа рабочей нагрузки регулятора ресурсов
Настройка регулятора ресурсов с помощью шаблона
Просмотр свойств регулятора ресурсов
ALTER RESOURCE GOVERNOR (Transact-SQL)
CREATE RESOURCE POOL (Transact-SQL)
CREATE WORKLOAD GROUP (Transact-SQL)
CREATE FUNCTION (Transact-SQL)
ALTER RESOURCE GOVERNOR (Transact-SQL)