Condividi tramite


Esercitazione: Esempi di configurazione di Resource Governor e migliori pratiche

si applica a:SQL ServerIstanza gestita di SQL di Azure

Questo articolo contiene esempi di procedura dettagliata che consentono di configurare Resource Governor e verificare che la configurazione funzioni come previsto. Inizia con un semplice esempio e progredisce a quelli più complessi.

L'articolo include anche esempi di query di monitoraggio di resource governor e un elenco di migliori pratiche di resource governor .

Tutti gli esempi presuppongono che inizialmente Resource Governor sia disabilitato e usi le impostazioni predefinite e che non esistano pool di risorse definiti dall'utente, gruppi di carico di lavoro e funzioni di classificazione.

Nota

Per modificare la configurazione di Resource Governor in Istanza gestita di SQL di Azure, è necessario trovarsi nel contesto del database master nella replica primaria.

Modificare il gruppo predefinito

Questo esempio usa Resource Governor per limitare le dimensioni massime di una concessione di memoria per tutte le query utente. Questa operazione viene eseguita riducendo l'impostazione di REQUEST_MAX_MEMORY_GRANT_PERCENT per il gruppo di carico di lavoro default dal valore predefinito da 25% a 10%. L'esempio non usa una funzione di classificazione . Ciò significa che l'elaborazione dell'accesso non è influenzata e tutte le sessioni utente continuano a essere classificate nel gruppo di carico di lavoro default.

Potrebbe essere necessario limitare le dimensioni delle concessioni di memoria se le query sono in attesa di memoria perché altre query hanno riservato una quantità eccessiva di memoria. Per altre informazioni, vedere Risolvere i problemi di rallentamento delle prestazioni o di memoria insufficiente causati dalle concessioni di memoria in SQL Server.

  1. Modificare il gruppo di carico di lavoro predefinito.

    ALTER WORKLOAD GROUP [default] WITH (REQUEST_MAX_MEMORY_GRANT_PERCENT = 10);
    
  2. Abilitare Resource Governor per rendere effettiva la configurazione.

    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
  3. Convalidare la nuova impostazione, inclusa la nuova dimensione massima di una concessione di memoria.

    SELECT group_id,
           wg.name AS workload_group_name,
           rp.name AS resource_pool_name,
           wg.request_max_memory_grant_percent_numeric AS request_max_memory_grant_percent,
           rp.max_memory_kb * wg.request_max_memory_grant_percent_numeric AS request_max_memory_grant_size_kb
    FROM sys.resource_governor_workload_groups AS wg
    INNER JOIN sys.dm_resource_governor_resource_pools AS rp
    ON wg.pool_id = rp.pool_id;
    
  4. Per ripristinare la configurazione iniziale, eseguire lo script seguente:

    ALTER WORKLOAD GROUP [default] WITH (REQUEST_MAX_MEMORY_GRANT_PERCENT = 25);
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    ALTER RESOURCE GOVERNOR DISABLE;
    

Usare un gruppo di carico di lavoro definito dall'utente

Questo esempio usa Resource Governor per garantire che tutte le richieste nelle sessioni con un nome di applicazione specifico non vengano eseguite con il grado di parallelismo (DOP) superiore a quattro. Questa operazione viene eseguita classificando le sessioni in un gruppo di carico di lavoro con l'impostazione MAX_DOP impostata su 4.

Per ulteriori informazioni sulla configurazione del grado massimo di parallelismo, vedere configurazione del server: massimo grado di parallelismo.

  1. Creare un gruppo di carico di lavoro che limiti il DOP. Il gruppo usa il pool di risorse default perché si vuole limitare solo il DOP per un'applicazione specifica, ma non riservare o limitare cpu, memoria o risorse di I/O.

    CREATE WORKLOAD GROUP limit_dop
    WITH (
         MAX_DOP = 4
         )
    USING [default];
    
  2. Creare la funzione di classificazione. La funzione usa la funzione APP_NAME predefinita per determinare il nome dell'applicazione specificato nella stringa di connessione client. Se il nome dell'applicazione è impostato su limited_dop_application, la funzione restituisce il nome del gruppo di carico di lavoro che limita il valore DOP. In caso contrario, la funzione restituisce default come nome del gruppo del carico di lavoro.

    USE master;
    GO
    
    CREATE FUNCTION dbo.rg_classifier()
    RETURNS sysname
    WITH SCHEMABINDING
    AS
    BEGIN
    
    DECLARE @WorkloadGroupName sysname = N'default';
    
    IF APP_NAME() = N'limited_dop_application'
        SELECT @WorkloadGroupName = N'limit_dop';
    
    RETURN @WorkloadGroupName;
    
    END;
    GO
    
  3. Modificare la configurazione di Resource Governor per rendere effettiva la configurazione e abilitare Resource Governor.

    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier);
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
  4. query sys.resource_governor_configuration per verificare che Resource Governor sia abilitato e usi la funzione di classificazione creata.

    SELECT OBJECT_SCHEMA_NAME(classifier_function_id) AS classifier_schema_name,
           OBJECT_NAME(classifier_function_id) AS classifier_object_name,
           is_enabled
    FROM sys.resource_governor_configuration;
    
    classifier_schema_name      classifier_object_name      is_enabled
    ----------------------      ----------------------      ----------
    dbo                         rg_classifier               1
    
  5. Verificare che le sessioni con un nome di applicazione specifico siano classificate nel gruppo di carico di lavoro limit_dop, mentre le altre sessioni continuano a essere classificate nel gruppo di carico di lavoro default. Verrà usata una query che usa sys.dm_exec_sessions e sys.resource_governor_workload_groups viste di sistema per restituire il nome dell'applicazione e il nome del gruppo di carico di lavoro per la sessione corrente.

    1. In SQL Server Management Studio (SSMS), selezionare File nel menu principale, Nuovo, Query Motore di Database.

    2. Nella finestra di dialogo Connetti al motore di database specificare la stessa istanza del motore di database in cui è stato creato il gruppo di carico di lavoro e la funzione di classificazione. Selezionare la scheda Parametri di connessione aggiuntivi e immettere App=limited_dop_application. In questo modo SSMS usa limited_dop_application come nome dell'applicazione durante la connessione all'istanza.

    3. Selezionare Connetti per aprire una nuova connessione.

    4. Nella stessa finestra di query eseguire la query seguente:

      SELECT s.program_name AS application_name,
             wg.name AS workload_group_name,
             wg.max_dop
      FROM sys.dm_exec_sessions AS s
      INNER JOIN sys.resource_governor_workload_groups AS wg
      ON s.group_id = wg.group_id
      WHERE s.session_id = @@SPID;
      

      Verrà visualizzato l'output seguente, che mostra che la sessione è stata classificata nel gruppo di carico di lavoro limit_dop con il valore dop massimo impostato su quattro:

      application_name            workload_group_name     max_dop
      ----------------            -------------------     -------
      limited_dop_application     limit_dop               4
      
    5. Ripetere i passaggi precedenti, ma non immettere nulla nella casella nella scheda Parametri di connessione aggiuntivi. L'output cambia, che mostra il nome predefinito dell'applicazione SSMS e il gruppo di carico di lavoro default con il valore 0 predefinito per il valore massimo di DOP.

      application_name                                    workload_group_name     max_dop
      ----------------                                    -------------------     -------
      Microsoft SQL Server Management Studio - Query      default                 0
      
  6. Per ripristinare la configurazione iniziale di questo esempio, disconnettere tutte le sessioni usando il gruppo di carico di lavoro limit_dop ed eseguire lo script T-SQL seguente. Lo script include i passaggi seguenti:

    1. Disabilitare Resource Governor in modo che la funzione di classificazione possa essere eliminata.
    2. Eliminare il gruppo di carico di lavoro. Ciò richiede che nessuna sessione usi questo gruppo di carico di lavoro.
    3. Riconfigurare Resource Governor per ricaricare la configurazione effettiva senza la funzione di classificazione e il gruppo di carico di lavoro. Ciò abilita Resource Governor.
    4. Disabilitare Resource Governor per ripristinare la configurazione iniziale.
    /* Disable resource governor so that the classifier function can be dropped. */
    ALTER RESOURCE GOVERNOR DISABLE;
    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL);
    DROP FUNCTION IF EXISTS dbo.rg_classifier;
    
    /* Drop the workload group. This requires that no sessions are using this workload group. */
    DROP WORKLOAD GROUP limit_dop;
    
    /* Reconfigure resource governor to reload the effective configuration without the classifier function and the workload group. This enables resource governor. */
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
    /* Disable resource governor to revert to the initial configuration. */
    ALTER RESOURCE GOVERNOR DISABLE;
    

Usare più pool di risorse e gruppi di carico di lavoro

Questo esempio usa Resource Governor per classificare le sessioni da un'applicazione di elaborazione degli ordini in gruppi di carico di lavoro e pool di risorse diversi a seconda dell'ora del giorno. Questa configurazione alloca più risorse all'applicazione durante i periodi di picco di elaborazione e limita le risorse durante gli orari di minore attività. L'esempio presuppone che l'applicazione non usi sessioni con esecuzione prolungata.

  1. Creare due pool di risorse per le ore di punta e le ore di minore attività di elaborazione.

    • Il pool di peak_hours_pool garantisce (riserva) almeno 20% della larghezza di banda media della CPU tramite MIN_CPU_PERCENTe non limita la larghezza di banda della CPU impostando MAX_CPU_PERCENT su 100.
    • Il pool di off_hours_pool non riserva alcuna larghezza di banda della CPU impostando MIN_CPU_PERCENT su 0, ma limita la larghezza di banda della CPU a 50% quando è presente una contesa della CPU impostando MAX_CPU_PERCENT su 50.
    CREATE RESOURCE POOL peak_hours_pool
    WITH (
         MIN_CPU_PERCENT = 20,
         MAX_CPU_PERCENT = 100
         );
    
    CREATE RESOURCE POOL off_hours_pool
    WITH (
         MIN_CPU_PERCENT = 0,
         MAX_CPU_PERCENT = 50
         );
    

    I pool di risorse possono riservare e limitare le risorse di sistema, ad esempio CPU, memoria e I/O. Per altre informazioni, vedere CREATE RESOURCE POOL.

  2. Creare due gruppi di carico di lavoro, uno rispettivamente per ogni pool di risorse.

    • Il peak_hours_group non limita il numero di richieste simultanee impostando GROUP_MAX_REQUESTS sul valore predefinito di 0.
    • Il off_hours_group limita il numero di richieste simultanee in tutte le sessioni classificate in questo gruppo impostando GROUP_MAX_REQUESTS su 200.
    CREATE WORKLOAD GROUP peak_hours_group
    WITH (
         GROUP_MAX_REQUESTS = 0
         )
    USING peak_hours_pool;
    
    CREATE WORKLOAD GROUP off_hours_group
    WITH (
         GROUP_MAX_REQUESTS = 200
         )
    USING off_hours_pool;
    

    I gruppi di carico di lavoro definiscono criteri come il numero massimo di richieste, il grado massimo di parallelismo e le dimensioni massime delle concessioni di memoria. Per altre informazioni, vedere CREATE WORKLOAD GROUP.

  3. Creare e popolare una tabella che definisce gli intervalli di tempo di picco e di minore attività.

    • Ogni riga della tabella definisce l'ora di inizio e di fine dell'intervallo e il nome del gruppo di carico di lavoro da usare durante l'intervallo.
    • L'ora di inizio e di fine di ogni intervallo è inclusiva.
    • La tabella viene creata nel database master in modo che possa essere usata in una funzione di classificazione associata a schema.
    USE master;
    GO
    
    CREATE TABLE dbo.workload_interval
    (
    workload_group_name sysname NOT NULL,
    start_time time(7) NOT NULL,
    end_time time(7) NOT NULL,
    CONSTRAINT pk_workload_interval PRIMARY KEY (start_time, workload_group_name),
    CONSTRAINT ak_workload_interval_1 UNIQUE (end_time, workload_group_name),
    CONSTRAINT ck_workload_interval_1 CHECK (start_time < end_time)
    );
    GO
    
    INSERT INTO dbo.workload_interval
    VALUES (N'off_hours_group', '00:00', '06:29:59.9999999'),
           (N'peak_hours_group', '06:30', '18:29:59.9999999'),
           (N'off_hours_group', '18:30', '23:59:59.9999999');
    
  4. Creare la funzione di classificazione.

    • I dati nella tabella devono avere una singola riga corrispondente per qualsiasi ora del giorno. Se i dati violano tale regola, la funzione restituisce default come nome del gruppo di carico di lavoro.
    • La funzione di esempio seguente restituisce anche default se il nome dell'applicazione restituito dalla funzione APP_NAME() predefinita è diverso da order_processing.
    USE master;
    GO
    
    CREATE OR ALTER FUNCTION dbo.rg_classifier()
    RETURNS sysname
    WITH SCHEMABINDING
    AS
    BEGIN
    
    DECLARE @WorkloadGroupName sysname = N'default';
    
    SELECT @WorkloadGroupName = workload_group_name
    FROM dbo.workload_interval
    WHERE APP_NAME() = N'order_processing'
          AND
          CAST(GETDATE() AS time(7)) BETWEEN start_time AND end_time;
    
    IF @@ROWCOUNT > 1
        SELECT @WorkloadGroupName = N'default';
    
    RETURN @WorkloadGroupName;
    
    END;
    GO
    
  5. Questo è un passaggio facoltativo. Anziché creare una tabella nel database master, è possibile usare un costruttore con valori di tabella per definire gli intervalli di tempo direttamente nella funzione di classificazione. Questo è l'approccio consigliato quando le dimensioni dei dati sono ridotte e i criteri della funzione di classificazione non vengono modificati di frequente. Di seguito è riportato un esempio dello stesso classificatore che usa un costruttore con valori di tabella anziché una tabella in master.

    USE master;
    GO
    
    CREATE OR ALTER FUNCTION dbo.rg_classifier()
    RETURNS sysname
    WITH SCHEMABINDING
    AS
    BEGIN
    
    DECLARE @WorkloadGroupName sysname = N'default';
    
    SELECT @WorkloadGroupName = workload_group_name
    FROM (
         VALUES (CAST(N'off_hours_group' AS sysname),  CAST('00:00' AS time(7)), CAST('06:29:59.9999999' AS time(7))),
                (CAST(N'peak_hours_group' AS sysname), CAST('06:30' AS time(7)), CAST('18:29:59.9999999' AS time(7))),
                (CAST(N'off_hours_group' AS sysname),  CAST('18:30' AS time(7)), CAST('23:59:59.9999999'AS time(7)))
         ) AS wg (workload_group_name, start_time, end_time)
    WHERE APP_NAME() = N'order_processing'
          AND
          CAST(GETDATE() AS time(7)) BETWEEN start_time AND end_time;
    
    IF @@ROWCOUNT > 1
        SELECT @WorkloadGroupName = N'default';
    
    RETURN @WorkloadGroupName;
    
    END;
    GO
    
  6. Modificare la configurazione di Resource Governor per rendere effettiva la configurazione e abilitare Resource Governor.

    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier);
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
  7. Verificare che Resource Governor sia abilitato, usi la funzione di classificazione specificata e che la funzione di classificazione funzioni come previsto usando passaggi simili come nell'esempio precedente . Questa volta si immette App=order_processing nella scheda Parametri di connessione aggiuntivi nella finestra di dialogo di connessione di SSMS in modo che corrisponda al nome dell'applicazione nella funzione di classificazione. Eseguire la query seguente per determinare il nome dell'applicazione, il gruppo di carico di lavoro, il pool di risorse e la prenotazione della CPU e il limite per la sessione corrente:

    SELECT s.program_name AS application_name,
           wg.name AS workload_group_name,
           wg.group_max_requests,
           rp.name AS resource_pool_name,
           rp.min_cpu_percent,
           rp.max_cpu_percent
    FROM sys.dm_exec_sessions AS s
    INNER JOIN sys.resource_governor_workload_groups AS wg
    ON s.group_id = wg.group_id
    INNER JOIN sys.resource_governor_resource_pools AS rp
    ON wg.pool_id = rp.pool_id
    WHERE s.session_id = @@SPID;
    

    I risultati dipendono dall'ora del giorno. Ad esempio, se l'ora corrente è 14:30, il risultato mostra che vengono usati peak_hours_group e peak_hours_pool:

    application_name    workload_group_name     group_max_requests      resource_pool_name      min_cpu_percent     max_cpu_percent
    -----------------   --------------------    ------------------      -------------------     ---------------     ---------------
    order_processing    peak_hours_group        0                       peak_hours_pool         20                  100
    
  8. Per ripristinare la configurazione iniziale di questo esempio, disconnettere tutte le sessioni usando i gruppi di carico di lavoro peak_hours_group e off_hours_group ed eseguire lo script T-SQL seguente. Lo script include i passaggi seguenti:

    1. Disabilitare Resource Governor in modo che la funzione di classificazione possa essere eliminata.
    2. Eliminare i gruppi di carico di lavoro. Ciò richiede che nessuna sessione usi questi gruppi di carico di lavoro.
    3. Dopo aver eliminato i gruppi di carico di lavoro, eliminare i pool di risorse.
    4. Riconfigurare Resource Governor per ricaricare la configurazione effettiva senza la funzione di classificazione e i gruppi di carico di lavoro definiti dall'utente e i pool di risorse. Ciò abilita il Resource Governor.
    5. Disabilitare Resource Governor per ripristinare la configurazione iniziale.
    /* Disable resource governor so that the classifier function can be dropped. */
    ALTER RESOURCE GOVERNOR DISABLE;
    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL);
    DROP FUNCTION IF EXISTS dbo.rg_classifier;
    DROP TABLE IF EXISTS dbo.workload_interval;
    
    /* Drop the workload groups. This requires that no sessions are using these workload groups. */
    DROP WORKLOAD GROUP peak_hours_group;
    DROP WORKLOAD GROUP off_hours_group;
    
    /* Once the workload groups are dropped, drop the resource pools. */
    DROP RESOURCE POOL peak_hours_pool;
    DROP RESOURCE POOL off_hours_pool;
    
    /* Reconfigure resource governor to reload the effective configuration without the classifier function and user-defined workload groups and resource pools. This enables resource governor. */
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
    /* Disable resource governor to revert to the initial configuration. */
    ALTER RESOURCE GOVERNOR DISABLE;
    

Monitorare il Resource Governor usando le viste di sistema

Le query di esempio in questa sezione illustrano come monitorare le statistiche e il comportamento del runtime di Resource Governor.

Le statistiche di Resource Governor sono cumulative dopo l'ultimo riavvio del server. Se è necessario raccogliere statistiche a partire da un determinato momento, è possibile reimpostare le statistiche usando l'istruzione ALTER RESOURCE GOVERNOR RESET STATISTICS.

Statistiche del tempo di esecuzione del pool di risorse

Per ogni pool di risorse, Resource Governor tiene traccia dell'utilizzo della CPU e della memoria, degli eventi di memoria insufficiente, delle concessioni di memoria, delle operazioni di I/O e di altre statistiche. Per altre informazioni, vedere sys.dm_resource_governor_resource_pools.

La query seguente restituisce un subset di statistiche disponibili per tutti i pool di risorse:

SELECT rp.pool_id,
       rp.name AS resource_pool_name,
       wg.workload_group_count,
       rp.statistics_start_time,
       rp.total_cpu_usage_ms,
       rp.target_memory_kb,
       rp.used_memory_kb,
       rp.out_of_memory_count,
       rp.active_memgrant_count,
       rp.total_memgrant_count,
       rp.total_memgrant_timeout_count,
       rp.read_io_completed_total,
       rp.write_io_completed_total,
       rp.read_bytes_total,
       rp.write_bytes_total,
       rp.read_io_stall_total_ms,
       rp.write_io_stall_total_ms
FROM sys.dm_resource_governor_resource_pools AS rp
OUTER APPLY (
            SELECT COUNT(1) AS workload_group_count
            FROM sys.dm_resource_governor_workload_groups AS wg
            WHERE wg.pool_id = rp.pool_id
            ) AS wg;

Statistiche di runtime del gruppo di carico di lavoro

Per ogni gruppo di carico di lavoro, Resource Governor tiene traccia del tempo di CPU, del numero di richieste, delle attività bloccate, del tempo di attesa di blocco, delle ottimizzazioni delle query e di altre statistiche. Per maggiori informazioni, consultare i gruppi di lavoro di controllo delle risorse sys.resource_governor_workload_groups.

La query seguente restituisce un subset di statistiche disponibili per tutti i gruppi di carico di lavoro:

SELECT wg.name AS workload_group_name,
       rp.name AS resource_pool_name,
       wg.statistics_start_time,
       wg.total_request_count,
       wg.total_cpu_usage_ms,
       wg.blocked_task_count,
       wg.total_lock_wait_time_ms,
       wg.total_query_optimization_count,
       wg.max_request_grant_memory_kb,
       wg.active_parallel_thread_count,
       wg.effective_max_dop,
       wg.request_max_memory_grant_percent_numeric
FROM sys.dm_resource_governor_workload_groups AS wg
INNER JOIN sys.dm_resource_governor_resource_pools AS rp
ON wg.pool_id = rp.pool_id

Aggregare le sessioni per gruppo di carico di lavoro e attributi di sessione

La query seguente restituisce una distribuzione di sessioni tra gruppi di carico di lavoro e statistiche di sessione aggregate per ogni gruppo di carico di lavoro.

Un numero elevato di sessioni con lo stato preconnect potrebbe indicare lentezza nell'esecuzione del classificatore.

SELECT wg.name AS workload_group_name,
       rp.name AS resource_pool_name,
       s.program_name AS application_name,
       s.login_name,
       s.host_name,
       s.status,
       d.name AS database_name,
       MIN(s.login_time) AS first_login_time,
       MAX(s.login_time) AS last_login_time,
       MAX(s.last_request_start_time) AS last_request_start_time,
       COUNT(1) AS session_count
FROM sys.dm_exec_sessions AS s
INNER JOIN sys.dm_resource_governor_workload_groups AS wg
ON s.group_id = wg.group_id
INNER JOIN sys.dm_resource_governor_resource_pools AS rp
ON wg.pool_id = rp.pool_id
INNER JOIN sys.databases AS d
ON s.database_id = d.database_id
GROUP BY wg.name,
         rp.name,
         s.program_name,
         s.login_name,
         s.host_name,
         s.status,
         d.name;

Aggregare le richieste per gruppo di carico di lavoro e attributi di richiesta

La query seguente restituisce una distribuzione delle richieste tra gruppi di carico di lavoro e statistiche di richiesta aggregate per ogni gruppo di carico di lavoro:

SELECT wg.name AS workload_group_name,
       rp.name AS resource_pool_name,
       r.command,
       r.status,
       d.name AS database_name,
       COUNT(1) AS request_count,
       MIN(r.start_time) AS first_request_start_time,
       MAX(r.start_time) AS last_request_start_time,
       SUM(CAST(r.total_elapsed_time AS bigint)) AS total_elapsed_time_ms
FROM sys.dm_exec_requests AS r
INNER JOIN sys.dm_resource_governor_workload_groups AS wg
ON r.group_id = wg.group_id
INNER JOIN sys.dm_resource_governor_resource_pools AS rp
ON wg.pool_id = rp.pool_id
INNER JOIN sys.databases AS d
ON r.database_id = d.database_id
GROUP BY wg.name,
         rp.name,
         r.command,
         r.status,
         d.name;

Pratiche ottimali per Resource Governor

  • Configurare la connessione amministrativa dedicata (DAC) e imparare a usarla. Per altre informazioni, vedere Connessione di diagnostica per gli amministratori di database. Se la configurazione di Resource Governor non funziona correttamente, è possibile usare la connessione amministrativa dedicata (DAC) per risolvere i problemi o per disabilitare Resource Governor.

  • Quando si configurano pool di risorse, prestare attenzione a specificare valori di grandi dimensioni per MIN_CPU_PERCENT, MIN_MEMORY_PERCENTe MIN_IOPS_PER_VOLUME. Un'impostazione di configurazione MIN riserva le risorse per un pool di risorse e le rende non disponibili per altri pool di risorse, incluso il pool di default. Per altre informazioni, vedere Creare un pool di risorse.

  • La funzione di classificazione estende il tempo di elaborazione dell'accesso. Evitare la logica complessa e le query a esecuzione prolungata o a elevato utilizzo di risorse nel classificatore, in particolare se le query usano tabelle di grandi dimensioni. Una funzione eccessivamente complessa può causare ritardi di accesso o timeout di connessione.

  • Se è necessario usare una tabella nel classificatore e la tabella è piccola e per lo più statica, è consigliabile usare un costruttore con valori di tabella , come illustrato in un esempio precedente in questo articolo.

  • Evitare di usare una tabella modificata di frequente nel classificatore. Ciò aumenta il rischio di blocco che può ritardare gli accessi e causare timeout di connessione. Le soluzioni alternative seguenti possono attenuare il rischio, ma presentano svantaggi, incluso il rischio di classificazione errata:

    • È consigliabile usare l'hint di tabella NOLOCK o l'hint READUNCOMMITTED equivalente. Per altre informazioni, vedere READUNCOMMITTED.
    • È consigliabile usare l'impostazione LOCK_TIMEOUT all'inizio della funzione di classificazione, impostandola su un valore basso, ad esempio 1.000 millisecondi. Per altre informazioni, vedere SET LOCK_TIMEOUT.
  • Se si esegue ALTER RESOURCE GOVERNOR RECONFIGURE dopo l'eliminazione di un pool di risorse inutilizzato in un computer con una grande quantità di memoria, il comando potrebbe richiedere molto tempo. Se una funzione di classificazione è attiva prima dell'avvio della riconfigurazione, è possibile che si verifichi un timeout dei nuovi tentativi di connessione.

    Se si elimina un pool di risorse inutilizzato, è consigliabile riconfigurare Resource Governor durante una finestra di manutenzione o un periodo di attività bassa.

  • Non è possibile modificare una funzione del classificatore mentre la configurazione di Resource Governor vi fa riferimento. Tuttavia, è possibile modificare la configurazione per usare una funzione di classificazione diversa. Se si desidera apportare modifiche al classificatore, è consigliabile creare una coppia di funzioni di classificazione. Ad esempio, è possibile creare dbo.rg_classifier_A() e dbo.rg_classifier_B(). Quando è necessaria una modifica alla logica del classificatore, seguire questa procedura:

    1. Usare l'istruzione ALTER FUNCTION per apportare le modifiche nella funzione non attualmente usate nella configurazione di Resource Governor.
    2. Usare l'istruzione ALTER RESOURCE GOVERNOR per rendere attivo il classificatore modificato e quindi riconfigurare Resource Governor. Per esempio:
      ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier_B);
      ALTER RESOURCE GOVERNOR RECONFIGURE;
      
    3. Se è necessaria di nuovo una modifica, seguire la stessa procedura usando l'altra funzione (dbo.rg_classifier_A()).
  • La configurazione di Resource Governor viene archiviata nel database master. Assicurarsi di eseguire periodicamente il backup di mastere sapere come ripristinarlo. Per altre informazioni, vedere Backup e ripristino: Database di sistema. Poiché esistono limitazioni per il ripristino di master, è consigliabile salvare separatamente una copia degli script di configurazione di Resource Governor. È possibile ricreare la configurazione di Resource Governor dagli script se è necessario ricompilare il database master.