sys.dm_os_schedulers (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Devuelve una fila por programador en SQL Server donde cada programador está asignado a un determinado procesador. Use esta vista para supervisar la condición de un programador o identificar tareas descontroladas. Para obtener más información sobre los programadores, consulte la Guía de arquitectura de subprocesos y tareas.

Nota:

Para llamarlo desde Azure Synapse Analytics o Analytics Platform System (PDW), use el nombre sys.dm_pdw_nodes_os_schedulers. El grupo de SQL sin servidor no admite esta sintaxis en Azure Synapse Analytics.

Nombre de la columna Tipo de datos Descripción
scheduler_address varbinary(8) Dirección de memoria del programador. No admite valores NULL.
parent_node_id int Identificador del nodo al que pertenece el programador, también denominado nodo primario. Representa un nodo de acceso de memoria no uniforme (NUMA). No admite valores NULL.
scheduler_id int Identificador del programador. Todos los programadores que se utilizan para ejecutar las consultas normales tienen números de identificación inferiores a 1048576. Sql Server usa internamente los programadores que tienen identificadores mayores o iguales que 1048576, como el programador de conexiones de administrador dedicado. No admite valores NULL.
cpu_id smallint Identificador de CPU asignado al programador.

No admite valores NULL.

Nota: 255 no indica ninguna afinidad como hizo en SQL Server 2005 (9.x). Consulte sys.dm_os_threads (Transact-SQL) para obtener información de afinidad adicional.
status nvarchar(60) Indica el estado del programador. Puede ser uno de los siguientes valores:

- OCULTO EN LÍNEA
- OCULTO SIN CONEXIÓN
- VISIBLE ONLINE
- VISIBLE SIN CONEXIÓN
- VISIBLE ONLINE (DAC)
- HOT_ADDED

No admite valores NULL.

Los programadores HIDDEN se usan para procesar las solicitudes que son internas de la Motor de base de datos. Los programadores VISIBLE se utilizan para procesar solicitudes de usuario.

Los programadores OFFLINE se asignan a procesadores sin conexión en la máscara de afinidad y, por tanto, no se utilizan para procesar solicitudes. Los programadores ONLINE se asignan a procesadores con conexión en la máscara de afinidad y están disponibles para procesar subprocesos.

DAC indica que el programador se está ejecutando con una conexión de administrador dedicada.

HOT ADDED indica los programadores que se agregaron en respuesta a un evento de CPU instalada en cliente.
is_online bit Si SQL Server está configurado para usar solo algunos de los procesadores disponibles en el servidor, esta configuración puede significar que algunos programadores se asignan a los procesadores que no están en la máscara de afinidad. Si así fuera, esta columna devuelve 0. Este valor indica que el programador no se utiliza para procesar consultas o lotes.

No admite valores NULL.
is_idle bit 1 = El programador está inactivo. No se está ejecutando ningún trabajador. No admite valores NULL.
preemptive_switches_count int Número de veces que los trabajadores de este programador han cambiado al modo preferente.

Para ejecutar código situado fuera de SQL Server (por ejemplo, en procedimientos almacenados extendidos y consultas distribuidas), se tiene que ejecutar un subproceso fuera del control del programador no preferente. Para hacerlo, un trabajador se cambia al modo preferente.
context_switches_count int Número de cambios de contexto que se han producido en este programador. No admite valores NULL.

Para permitir que se ejecuten otros trabajadores, el trabajador en ejecución actual tiene que renunciar al control del programador o el cambio de contexto.

Nota: Si un trabajador produce el programador y se coloca en la cola ejecutable y, a continuación, no encuentra ningún otro trabajo, el trabajador se seleccionará a sí mismo. En este caso, context_switches_count no se actualiza, sino que se actualiza yield_count.
idle_switches_count int Número de veces que el programador ha esperado por un evento mientras estaba inactivo. Esta columna es similar a context_switches_count. No admite valores NULL.
current_tasks_count int Número de tareas actuales que están asociadas con este programador. Este recuento incluye lo siguiente:

- Tareas que esperan a que un trabajador los ejecute.
- Tareas que están actualmente en espera o en ejecución (en estado SUSPENDED o RUNNABLE).

Cuando una tarea se completa, este contador disminuye. No admite valores NULL.
runnable_tasks_count int Número de trabajadores, con tareas asignadas, que están esperando a ser programados en la cola de ejecutables. No admite valores NULL.
current_workers_count int Número de trabajadores que están asociados a este programador. Este recuento incluye a los trabajadores que no están asignados a ninguna tarea. No admite valores NULL.
active_workers_count int Número de trabajadores activos. Un trabajador activo nunca es preferente, debe tener una tarea asociada, y está ejecutándose, es ejecutable o está suspendido. No admite valores NULL.
work_queue_count bigint Número de tareas en la cola de tareas pendientes. Estas tareas esperan a que un trabajador las ejecute. No admite valores NULL.
pending_disk_io_count int Número de E/S pendientes que esperan a completarse. Cada programador tiene una lista de E/S pendientes que se comprueban para determinar si se han completado cada vez que hay un cambio de contexto. El recuento aumenta cuando se inserta la solicitud. Este recuento disminuye cuando la solicitud se completa. Este número no indica el estado de las operaciones de E/S. No admite valores NULL.
load_factor int Valor interno que indica la carga detectada en este programador. Este valor se utiliza para determinar si una nueva tarea debe colocarse es este programador o en otro. Este valor es útil para tareas de depuración cuando parece que los programadores no están cargados equitativamente. La decisión de enrutamiento se toma en función de la carga del programador. SQL Server también usa un factor de carga de nodos y programadores para ayudar a determinar la mejor ubicación para adquirir recursos. Cuando una tarea se pone en cola, el factor de carga aumenta. Cuando una tarea se completa, el factor de carga disminuye. El uso de los factores de carga ayuda a equilibrar mejor la carga de trabajo del sistema operativo de SQL Server. No admite valores NULL.
yield_count int Valor interno que se utiliza para indicar el progreso en este programador. El monitor de programadores utiliza este valor para determinar si un trabajador del programador no está generando otros trabajadores a tiempo. Este valor no indica que el trabajador o la tarea se transfirieron a un nuevo trabajador. No admite valores NULL.
last_timer_activity bigint En tics de CPU, la última vez que el programador comprobó la cola del temporizador del programador. No admite valores NULL.
failed_to_create_worker bit Se establece en 1 si no se pudo crear un trabajador en este programador. Generalmente se produce debido a restricciones de memoria. Acepta valores NULL.
active_worker_address varbinary(8) Dirección de memoria del trabajador que está activo actualmente. Acepta valores NULL. Para obtener más información, consulte sys.dm_os_workers (Transact-SQL).
memory_object_address varbinary(8) Dirección de memoria del objeto de memoria del programador. No ADMITE VALORES NULL.
task_memory_object_address varbinary(8) Dirección de memoria del objeto de memoria de la tarea. No admite valores NULL. Para más información, vea sys.dm_os_memory_objects (Transact-SQL).
quantum_length_us bigint Solamente se identifica con fines informativos. No compatible. La compatibilidad con versiones posteriores no está garantizada. Expone el quantum del programador usado por SQLOS.
total_cpu_usage_ms bigint Se aplica a: SQL Server 2016 (13.x) y versiones posteriores

Cpu total consumida por este programador según lo notificado por los trabajadores no preferentes. No admite valores NULL.
total_cpu_idle_capped_ms bigint Solamente se identifica con fines informativos. No compatible. La compatibilidad con versiones posteriores no está garantizada. Indica la limitación basada en el objetivo de nivel de servicio, siempre será 0 para las versiones que no son de Azure de SQL Server. Acepta valores NULL.
total_scheduler_delay_ms bigint Se aplica a: SQL Server 2016 (13.x) y versiones posteriores

El tiempo entre un trabajador que cambia y otro. Puede deberse a que los trabajos preventivos retrasan la programación del siguiente trabajo no preferente o debido a los subprocesos de programación del sistema operativo de otros procesos. No admite valores NULL.
ideal_workers_limit int Se aplica a: SQL Server 2019 (15.x) y versiones posteriores

El número de trabajadores debe estar idealmente en el programador. Si los trabajadores actuales superan el límite debido a la carga de tareas desequilibrado, una vez que se vuelvan inactivos, se recortarán. No admite valores NULL.
pdw_node_id int Se aplica a: Azure Synapse Analytics, Sistema de la plataforma de análisis (PDW)

Identificador del nodo en el que se encuentra esta distribución.

Permisos

En SQL Server y SQL Managed Instance, requiere el permiso VIEW SERVER STATE.

En los objetivos de servicio de SQL Database Basic, S0 y S1, y para las bases de datos de grupos elásticos, se requiere la cuenta de administrador del servidor, la cuenta de administrador de Microsoft Entra o la pertenencia al rol de ##MS_ServerStateReader##servidor. En el resto de objetivos del servicio de SQL Database, se requiere el permiso VIEW DATABASE STATE en la base de datos o la pertenencia en el rol del servidor ##MS_ServerStateReader##.

Permisos para SQL Server 2022 y versiones posteriores

Requiere el permiso VER ESTADO DE RENDIMIENTO DEL SERVIDOR en el servidor.

Ejemplos

A Supervisar programadores ocultos y no ocultos

La consulta siguiente genera el estado de los trabajos y las tareas de SQL Server en todos los programadores. Esta consulta se ejecutó en un sistema que incluye lo siguiente:

  • Dos procesadores (CPU)

  • Dos nodos (NUMA)

  • Una CPU por nodo NUMA

  • Máscara de afinidad establecida en 0x03.

SELECT  
    scheduler_id,  
    cpu_id,  
    parent_node_id,  
    current_tasks_count,  
    runnable_tasks_count,  
    current_workers_count,  
    active_workers_count,  
    work_queue_count  
  FROM sys.dm_os_schedulers;  

El conjunto de resultados es el siguiente:

scheduler_id cpu_id parent_node_id current_tasks_count  
------------ ------ -------------- -------------------  
0            1      0              9                    
257          255    0              1                    
1            0      1              10                   
258          255    1              1                    
255          255    32             2                    
  
runnable_tasks_count current_workers_count  
-------------------- ---------------------  
0                    11                     
0                    1                      
0                    18                     
0                    1                      
0                    3                      
  
active_workers_count work_queue_count  
-------------------- --------------------  
6                    0  
1                    0  
8                    0  
1                    0  
1                    0  

La salida proporciona la siguiente información:

  • Hay cinco programadores. Dos programadores tienen un valor < de identificador 1048576. Los programadores con id >. = 1048576 se conocen como programadores ocultos. El programador 255 representa la conexión de administrador dedicada (DAC). Existe un programador DAC por sesión. Los monitores de recursos que coordinan la presión de memoria utilizan los programadores 257 y 258, uno por nodo NUMA.

  • La salida muestra 23 tareas activas. Estas tareas incluyen solicitudes de usuario además de tareas de administración de recursos iniciadas por SQL Server. Algunos ejemplos de tareas de SQL Server son RESOURCE MONITOR (uno por nodo NUMA), LAZY WRITER (uno por nodo NUMA), LOCK MONITOR, CHECKPOINT y LOG WRITER.

  • El nodo NUMA 0 se asigna a la CPU 1 y el nodo NUMA 1 se asigna a la CPU 0. SQL Server normalmente se inicia en un nodo NUMA distinto del nodo 0.

  • Cuando runnable_tasks_count devuelve 0, no hay ninguna tarea activa en ejecución. Sin embargo, pueden existir sesiones activas.

  • El programador 255 que representa la conexión DAC incluye 3 trabajadores asociados. Estos trabajos se asignan al inicio de SQL Server y no cambian. Se utilizan únicamente para procesar consultas DAC. Las dos tareas de este programador representan un administrador de conexiones y un trabajador inactivo.

  • active_workers_count representa todos los trabajos que tienen tareas asociadas y se ejecutan en modo no preferente. Algunas tareas, como las escuchas de red, se ejecutan con programas preferentes.

  • Los programadores ocultos no procesan solicitudes habituales de usuario. El programador DAC es la excepción. Este programador dispone de un subproceso para ejecutar solicitudes.

B. Supervisar programadores no ocultos en un sistema ocupado

En la consulta siguiente se muestra el estado de programadores no ocultos con mucha carga en los que existen más solicitudes de las que pueden controlar los trabajadores disponibles. En este ejemplo tienen asignadas tareas 256 trabajadores. Algunas tareas están esperando su asignación a un trabajador. El recuento bajo de ejecutables implica que varias tareas están esperando un recurso.

Nota:

Puede conocer el estado de los trabajadores si consulta sys.dm_os_workers. Para obtener más información, consulte sys.dm_os_workers (Transact-SQL).

Esta es la consulta:

SELECT  
    scheduler_id,  
    cpu_id,  
    current_tasks_count,  
    runnable_tasks_count,  
    current_workers_count,  
    active_workers_count,  
    work_queue_count  
  FROM sys.dm_os_schedulers  
  WHERE scheduler_id < 255;  

El conjunto de resultados es el siguiente:

scheduler_id current_tasks_count runnable_tasks_count  
------------ ------------------- --------------------  
0            144                 0                     
1            147                 1                     
  
current_workers_count active_workers_count work_queue_count  
--------------------- -------------------- --------------------  
128                   125                  16  
128                   126                  19  

Por comparación, el resultado siguiente muestra varias tareas ejecutables donde ninguna tarea está esperando para obtener un trabajador. El valor de work_queue_count es 0 en ambos programadores.

scheduler_id current_tasks_count runnable_tasks_count  
------------ ------------------- --------------------  
0            107                 98                    
1            110                 100                   
  
current_workers_count active_workers_count work_queue_count  
--------------------- -------------------- --------------------  
128                   104                  0  
128                   108                  0  

Consulte también

Vistas de administración dinámica relacionadas con el sistema operativo de SQL Server (Transact-SQL)