Udostępnij za pośrednictwem


How to: Create and Test a Classifier User-Defined Function (Transact-SQL)

W tym temacie opisano sposób tworzenia i testowania funkcja zdefiniowanej przez użytkownika klasyfikatora (UDF).Kroki dotyczą, wykonywanie Transact-SQL instrukcje w SQL Server Management Studio Edytor kwerend. Zaleca się przeczytanie Uwagi dotyczące zapisywania, funkcja klasyfikatora przed kontynuowaniem.

W przykładzie pokazano w poniższej procedurze pokazano możliwości tworzenia dość złożona klasyfikatora funkcja zdefiniowanej przez użytkownika.

W naszym przykładzie:

  • Pula zasób (pProductionProcessing) i grupa obciążenia (gProductionProcessing) są tworzone dla produkcji przetwarzania w określonym czasie zakres.

  • Pula zasób (pOffHoursProcessing) i grupa obciążenia (gOffHoursProcessing) są tworzone do obsługi połączeń, które nie spełniają wymagań dotyczących produkcji przetwarzanie.

  • Tabela (TblClassificationTimeTable) jest tworzony w wzorca do przechowywania rozpoczęcia i zakończenia godzin, które może przyjmować od czas logowania.To musi zostać utworzony w głównego, ponieważ zasób Governor używa wiązanie schematu dla funkcji klasyfikatora.

    Uwaga

    Najlepiej nie należy przechowywać duże, często aktualizowaną tabel w głównego.

Jak wspomniano w Uwagi dotyczące pisania funkcja klasyfikatora, funkcja Klasyfikator rozszerza czas logowania. Nadmiernie złożonych funkcja może spowodować logowania limitu czas lub spowolnić szybkiego połączenia.

Aby utworzyć funkcja zdefiniowaną przez użytkownika klasyfikatora

  1. Tworzenie i konfigurowanie nowych pul zasób i Obciążenie pracą grupy.Przypisać sobie grupa obciążenia do puli zasób odpowiednie.

    --- 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
    
  2. Aktualizacja konfiguracja w pamięci.

    ALTER RESOURCE GOVERNOR RECONFIGURE
    GO
    
  3. Tworzenie tabela i określić czas rozpoczęcia i zakończenia dla przedziału czasu przetwarzania produkcji.

    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
    
  4. Tworzenie funkcja klasyfikatora, który korzysta z funkcja czasu i wartości, które może przyjmować przed czas w tabela wyszukiwania.

    Uwaga

    SQL Server 2008 wprowadzono rozwinięty zbiór data i czas typów danych i funkcji.Aby uzyskać więcej informacji zobaczData i godzina, Data typy i funkcje (języka 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
    
  5. Zarejestruj funkcja klasyfikatora i zaktualizować konfiguracja w pamięci.

    ALTER RESOURCE GOVERNOR with (CLASSIFIER_FUNCTION = dbo.fnTimeClassifier)
    ALTER RESOURCE GOVERNOR RECONFIGURE
    GO
    

Aby sprawdzić pule zasób, grup obciążenia pracą i funkcja zdefiniowanej przez użytkownika klasyfikatora

  1. Konfiguracja grupy puli i Obciążenie zasób można uzyskać, korzystając z następującej kwerendy.

    USE master
    SELECT * FROM sys.resource_governor_resource_pools
    SELECT * FROM sys.resource_governor_workload_groups
    GO
    
  2. Sprawdź, czy funkcja Klasyfikator istnieje i czy jest włączone za pomocą następującej kwerendy.

    --- 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
    
  3. Uzyskaj aktualne dane środowisko wykonawcze dla puli zasób i Obciążenie pracą grupy za pomocą następującej kwerendy.

    SELECT * FROM sys.dm_resource_governor_resource_pools
    SELECT * FROM sys.dm_resource_governor_workload_groups
    GO
    
  4. Dowiedz się, jakie sesje są w każdej z grup, za pomocą następującej kwerendy.

    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
    
  5. Dowiedz się, które żądania są w każdej grupie za pomocą następującej kwerendy.

    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
    
  6. Dowiedz się, jakie żądania są uruchomione w klasyfikatorze za pomocą następującej kwerendy.

    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