sql >> Base de Datos >  >> RDS >> Sqlserver

Supervisión de TempDB de SQL Server mediante vistas de administración dinámica (DMV)

¿Qué es TempDB en MS SQL Server?

TempDB es una base de datos del sistema en Microsoft SQL Server que se utiliza como almacén de objetos internos, versiones de filas, tablas de trabajo, tablas temporales e índices. TempDB está disponible para que lo usen todos los participantes conectados a una instancia de SQL Server (es un recurso global). Para aquellos familiarizados con otros tipos de bases de datos, la base de datos tempDB es similar al espacio de tabla TEMP en Oracle. Para decirlo suavemente, cualquier cosa que no se ajuste a la memoria de su instancia se desborda a los archivos de datos tempdb.

TempDB se usa típicamente en los siguientes casos:

  1. Las tablas temporales se crean con la convención de nomenclatura #. He visto una o dos aplicaciones en mi tienda que crean muchas de estas convenciones. Como resultado, puede afectar el rendimiento. Para cada tabla temporal, TempDB distribuye páginas cuyo tamaño depende del tamaño de la tabla. Además, puede haber algunos conflictos si varias sesiones simultáneas crean tales TempTables simultáneamente.
  2. El nivel de aislamiento READ_COMMITTED_SNAPSHOT está habilitado. Tuvimos que hacer esto en dos de nuestras instancias hace algunos años porque había dos aplicaciones que estaban experimentando una gran cantidad de interbloqueos. El uso de los niveles de aislamiento de instantáneas es una forma de lidiar con los interbloqueos, especialmente si no desea ir y venir con los desarrolladores sobre la codificación adecuada. Debe tener en cuenta que se espera que esto ayude a mejorar el rendimiento. Sin embargo, utiliza un control de concurrencia optimista que puede no ser deseable en todos los casos con respecto a la integridad de los datos.
  3. Los índices se construyen o reconstruyen con la opción SORT_IN_TEMPDB=ON. Tiende a eliminar la carga de ordenar de la base de datos que posee el índice mientras el proceso de reconstrucción está en curso. Puede resultar útil examinar el impacto total de esta opción en el rendimiento de la instancia en su conjunto.
  4. La función Conjuntos de resultados activos múltiples (MARS) está habilitada. No, MARS no es un planeta en este escenario, es una función que permite que una aplicación envíe varios lotes a través de una sola conexión. Está deshabilitado de forma predeterminada y se puede habilitar explícitamente al incluir MultipleActiveResultSets=True en una cadena de conexión.
  5. Internamente, SQL Server también usó TempDB para crear tablas de trabajo que se usan comúnmente en operaciones de cursor:llamadas de las cláusulas GROUP BY, ORDER BY o UNION. Las tablas de trabajo se pueden considerar como tablas temporales creadas por la actividad del motor de SQL Server en lugar de por la actividad de un usuario directamente.

Vistas de administración dinámica relevantes SQL Server

Las siguientes vistas de administración dinámica (DMV) relevantes son útiles al investigar la actividad en TempDB:

  1. sys.dm_db_file_space_usage :este DMV devuelve información sobre el uso del espacio de los archivos en las bases de datos que le interesan. Puede usarse para examinar cualquier base de datos en la instancia y el resultado pertenece solo a esa base de datos. En el contexto de este artículo, usaremos el DMV para examinar TempDB.
  2. sys.dm_db_session_space_usage :Este DMV es exclusivo de la base de datos TempDB y devuelve el número de páginas asignadas y desasignadas por cada sesión para una base de datos determinada. Las asignaciones de páginas generalmente se mantienen hasta que finaliza la sesión.
  3. sys.dm_db_task_space_usage :este DMV también es exclusivo de la base de datos TempDB y brinda información sobre la cantidad de páginas asignadas y desasignadas por cada tarea para una base de datos determinada.
  4. sys.dm_tran_active_snapshot_database_transactions :Este DMV devuelve las transacciones activas que generan y pueden acceder a las versiones de fila. Esta vista es relevante cuando están habilitadas opciones como ALLOW_SNAPSHOT_ISOLATION y READ_COMMITTED_SNAPSHOT.
  5. sys.dm_tran_version_store :este DMV proporciona información sobre todos los registros de versión en el almacén de versiones. En un servidor de producción activo, los registros de esta tabla podrían crecer significativamente. Por lo tanto, debemos tener cuidado al consultar el DMV.

Examinar los comandos del DMV antes de trabajar con la base de datos TempDB

sys.dm_file_space_usage

Podemos obtener algunas descripciones de estos DMV de la documentación de Microsoft.

La Tabla 1 muestra la descripción de sys.dm_file_space_usage . La consulta del Listado 1 muestra el uso del espacio de archivo para las bases de datos TempDB y WideWorldImporters, respectivamente. Las imágenes 1 y 2 devuelven los resultados de esta consulta con las bases de datos TempDB y WideWorldImporters respectivamente.

[identificación de la tabla=44 /]

Tabla 1:descripción de sys.dm_file_space_usage

-- List 1: Check space usage on database files
-- Check space usage on tempdb
use tempdb
go
select db_name(database_id) [Database_name]
,file_name(file_id) [File_name]
,filegroup_id
,total_page_count [TPC]
,total_page_count*8/1024 [TSU (MB)]
,allocated_extent_page_count [AEPC]
,allocated_extent_page_count*8/1024 [AEPC (MB)]
,version_store_reserved_page_count [VSRP]
,version_store_reserved_page_count*8/1024 [VSRP (MB)]
,user_object_reserved_page_count [UORP]
,user_object_reserved_page_count*8/1024 [UORPC (MB)]
,internal_object_reserved_page_count [IORPC]
,internal_object_reserved_page_count*8/1024 [UORPC (MB)]
,mixed_extent_page_count [MEPC]
,mixed_extent_page_count*8/1024 [MEPC (MB)]
from sys.dm_db_file_space_usage;
-- Check space usage on WideWorldImporters
use WideWorldImporters
go
select db_name(database_id) [Database_name]
,file_name(file_id) [File_name]
,filegroup_id
,total_page_count [TPC]
,total_page_count*8/1024 [TSU (MB)]
,allocated_extent_page_count [AEPC]
,allocated_extent_page_count*8/1024 [AEPC (MB)]
,version_store_reserved_page_count [VSRP]
,version_store_reserved_page_count*8/1024 [VSRP (MB)]
,user_object_reserved_page_count [UORP]
,user_object_reserved_page_count*8/1024 [UORPC (MB)]
,internal_object_reserved_page_count [IORPC]
,internal_object_reserved_page_count*8/1024 [UORPC (MB)]
,mixed_extent_page_count [MEPC]
,mixed_extent_page_count*8/1024 [MEPC (MB)]
from sys.dm_db_file_space_usage;

Fig. 2 Salida de consulta en sys.dm_file_space_usage (WideWorldImporters)

Tenga en cuenta que la columna total_page_count muestra el tamaño exacto del archivo de la base de datos en cuestión. Además, los tipos de archivo LOG y FILESTREAM no se muestran. Además, como se esperaba, allocated_extent_page_count coincide con el espacio utilizado en el archivo de datos WWI_UserData.

Fig. 3 Tamaños de archivo en la base de datos de WideWorldImporters

sys.dm_db_session_space_usage

La Tabla 2 muestra el uso del DMV sys.dm_db_session_space_usage. El Listado 2 es el resultado de la consulta. Tenga en cuenta que la cantidad de filas devueltas coincide con la cantidad actual de sesiones (activas o inactivas) en la instancia. Además, recuerde que este DMV se refiere ÚNICAMENTE a TempDB.

[identificación de la tabla=45 /]

Tabla 2:descripción de sys.dm_db_session_space_usage

-- Listing 2: Check space allocation per session in the instance
-- Applies on to tempdb database
select
session_id
,db_name(database_id) [Database_name]
,user_objects_alloc_page_count [UOAPC]
,user_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,user_objects_dealloc_page_count [UODPC]
,user_objects_dealloc_page_count*8/1024 [UODPC (MB)]
,internal_objects_alloc_page_count [UOAPC]
,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,internal_objects_dealloc_page_count [UODPC]
,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)]
from sys.dm_db_session_space_usage;
select count(*) from sys.dm_exec_sessions;

sys.dm_db_task_space_usage

La Tabla 3 muestra la implementación del DMV sys.dm_db_task_space_usage. El Listado 3 muestra su salida.

[identificación de la tabla=46 /]

Tabla 3:descripción de sys.dm_db_task_space_usage

-- List 3: Check space allocation per task int the instance
-- Applies on to tempdb database
select
task_address
,is_remote_task
,session_id
,request_id
,exec_context_id
,db_name(database_id) [Database_name]
,user_objects_alloc_page_count [UOAPC]
,user_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,user_objects_dealloc_page_count [UODPC]
,user_objects_dealloc_page_count*8/1024 [UODPC (MB)]
,internal_objects_alloc_page_count [UOAPC]
,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)]
,internal_objects_dealloc_page_count [UODPC]
,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)]
from sys.dm_db_task_space_usage;

Otras consultas DMV en MSSQL TempDB

Los otros dos DMV parecen estar vacíos antes de que se ejecute cualquier actividad de la base de datos. Las tablas 4 y 5 muestran una descripción de ambas tablas. En la siguiente sección, veremos cómo cambian los datos en los DMV cuando generamos actividad en la base de datos.

[identificación de la tabla=47 /]

Tabla 4:descripción de sys.dm_tran_active_snapshot_database_transactions

[identificación de la tabla=48 /]

Tabla 5:descripción de sys.dm_tran_version_store

Examinar el DMV después de completar la actividad de la base de datos

Generemos algo de actividad.

Para hacer esto, ejecute las consultas simples en el listado 4.

-- Listing 4
-- Query 1
use WideWorldImporters
go
select * from
[Sales].[Invoices];
-- Query 2
use WideWorldImporters
go
select * from
[Sales].[Invoices]
order by ContactPersonID;

Como puede ver, no hay asignaciones o desasignaciones significativas de esta pequeña consulta, por lo que elevamos el listón al crear una tabla temporal usando el script en el Listado 5.

-- Listing 5
use WideWorldImporters
go
select *
into [#Invoices]
from [Sales].[Invoices];
use tempdb
go
drop table [#Invoices];

Ahora tenemos un número significativo de páginas asignadas y reservadas para nuestra sesión activa 62 (ver Fig. 8). Además, preste atención a la cantidad significativa de extensiones asignadas y páginas reservadas que se muestran en sys.dm_db_file_space_usage (Fig. 9).

Cuando continuamos y soltamos la #Factura de Temptable, vemos que las páginas asignadas en TempDB se liberan como se muestra en la Fig. 12. Sin embargo, la salida de dm_db_session_space_usage DMV todavía indica que algunas páginas están asignadas a la sesión. Vemos que esto se libera tan pronto como cerramos la sesión (ID de sesión 62).

A continuación, abrimos otra sesión y creamos un índice usando las consultas del Listado 6. En la Consulta 1 excluyendo la opción SORT_IN_TEMPDB y en la Consulta 2, usamos esta opción después de descartar el índice. No ocurren asignaciones significativas para el primer caso, pero vemos algunos cambios al usar SORT_IN_TEMPDB. Este cambio es muy leve dado el tamaño del índice en cuestión (ver Fig. 16 y 17).

Realizaremos la prueba final. Descubrimos que hasta este momento los DMV como sys.dm_tran_active_snapshot_database_transactions y sys.dm_tran_version_store no devuelven filas cuando se les consulta.

Habilitemos los niveles de aislamiento SNAPSHOT_ISOLATION y READ_COMMITTED_SNAPSHOT (Listado 7). Una vez hecho esto, una sola declaración de actualización crea un registro en el DMV sys.dm_tran_version_store. Poner esta misma consulta es una transacción que usamos para ver que también se genera un registro en el sys.dm_tran_active_snapshot_database_transactions durante la transacción.

-- Listing 7
ALTER DATABASE WideWorldImporters
SET ALLOW_SNAPSHOT_ISOLATION ON;
ALTER DATABASE WideWorldImporters
SET READ_COMMITTED_SNAPSHOT ON;
-- Listing 8
-- Query 1
 update [WideWorldImporters].[Sales].[Invoices]
 set DeliveryInstructions='Shop 50, 1476 Poddar Lane'
 where InvoiceID=48;
-- Query 2
-- Transaction
BEGIN TRAN
 update [WideWorldImporters].[Sales].[Invoices]
 set DeliveryInstructions='Shop 50, 1476 Poddar Lane'
 where InvoiceID=48;
 WAITFOR DELAY '00:00:30';
COMMIT TRAN;
GO

Conclusión

Hemos explorado brevemente que podemos monitorear la actividad de TempDB utilizando cinco DMV clave expuestos por SQL Server. Al usar este nivel del proceso de monitoreo en un entorno de producción, podemos determinar si necesitamos más espacio en TempDB y archivos de datos. Además, podemos analizar el impacto del aislamiento SNAPSHOT si hemos habilitado esta característica antes.

Los datos de salida de estos DMV también podrían ser útiles para mostrar claramente a los desarrolladores de aplicaciones el impacto del comportamiento de su código en tempDB y la instancia en su conjunto. En general, es bastante gratificante comprender el uso de estos DMV como DBA preocupado por el rendimiento y la gestión del espacio.

Referencias

Aislamiento de instantáneas en SQL Server
Uso de varios conjuntos de resultados activos
Descripción de sys.dm_tran_version_store
Descripción de sys.dm_db_task_space_usage
Descripción de sys.dm_file_space_usage
Descripción de sys.dm_db_session_space_usage
Descripción de sys.dm_tran_active_snapshot_database_transactions