Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Monitoramento do SQL Server TempDB usando exibições de gerenciamento dinâmico (DMV)

O que é TempDB no MS SQL Server?


TempDB é um banco de dados do sistema no Microsoft SQL Server usado como armazenamento de objetos internos, versões de linha, tabelas de trabalho, tabelas temporárias e índices. O TempDB está disponível para uso de todos os participantes conectados a uma instância do SQL Server (é um recurso global). Para aqueles familiarizados com outros tipos de banco de dados, o banco de dados tempDB é semelhante ao tablespace TEMP no Oracle. Para dizer o mínimo, qualquer coisa que não possa caber na memória da sua instância transborda para os arquivos de dados tempdb.



TempDB é normalmente usado nos seguintes casos:
  1. As tabelas temporárias são criadas com a # convenção de nomenclatura. Eu vi um ou dois aplicativos em minha loja que criam muitas dessas convenções. Como resultado, pode afetar o desempenho. Para cada tabela temporária, o TempDB distribui páginas cujo tamanho depende do tamanho da tabela. Além disso, pode haver alguns conflitos se várias sessões simultâneas estiverem criando essas TempTables simultaneamente.
  2. O nível de isolamento READ_COMMITTED_SNAPSHOT está ativado. Tivemos que fazer isso em duas de nossas instâncias há alguns anos, porque havia dois aplicativos que estavam enfrentando um número sério de deadlocks. Usar os níveis de isolamento de instantâneo é uma maneira de lidar com impasses, especialmente se você não quiser ir e voltar com os desenvolvedores sobre a codificação adequada. Você deve estar ciente de que isso deve ajudar a melhorar o desempenho. No entanto, ele usa o controle de simultaneidade otimista que pode não ser desejável em todos os casos com relação à integridade dos dados.
  3. Os índices são criados ou reconstruídos com a opção SORT_IN_TEMPDB=ON. Ele tende a remover o fardo da classificação do banco de dados que possui o índice enquanto o processo de reconstrução está em andamento. Pode ser útil examinar o impacto total dessa opção no desempenho da instância como um todo.
  4. A funcionalidade de vários conjuntos de resultados ativos (MARS) está ativada. Não, MARS não é um planeta nesse cenário, é um recurso que permite que um aplicativo envie vários lotes através de uma única conexão. Ele está desabilitado por padrão e pode ser habilitado explicitamente incluindo MultipleActiveResultSets=True em uma string de conexão.
  5. Internamente, o SQL Server também usou o TempDB para criar tabelas de trabalho que são comumente usadas em operações de cursor – chamadas pelas cláusulas GROUP BY, ORDER BY ou UNION. As tabelas de trabalho podem ser consideradas tabelas temporárias criadas pela atividade do mecanismo do SQL Server em vez de uma atividade do usuário diretamente.

Exibições de gerenciamento dinâmico relevantes SQL Server


As seguintes visualizações de gerenciamento dinâmico (DMVs) relevantes são úteis ao investigar a atividade no TempDB:
  1. sys.dm_db_file_space_usage :Este DMV retorna algumas informações sobre o uso de espaço dos arquivos nos bancos de dados nos quais você está interessado. Ele pode ser usado para examinar qualquer banco de dados na instância e a saída pertence apenas a esse banco de dados. No contexto deste artigo, usaremos o DMV para examinar o TempDB.
  2. sys.dm_db_session_space_usage :Este DMV é exclusivo do banco de dados TempDB e retorna o número de páginas alocadas e desalocadas por cada sessão para um determinado banco de dados. As alocações de página são normalmente mantidas até que a sessão seja encerrada.
  3. sys.dm_db_task_space_usage :Este DMV também é exclusivo do banco de dados TempDB e fornece algumas informações sobre o número de páginas alocadas e desalocadas por cada tarefa para um determinado banco de dados.
  4. sys.dm_tran_active_snapshot_database_transactions :este DMV retorna as transações ativas que geram e podem acessar as versões de linha. Essa visualização é relevante quando opções como ALLOW_SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT estão ativadas.
  5. sys.dm_tran_version_store :este DMV fornece algumas informações sobre todos os registros de versão no armazenamento de versão. Em um servidor de produção ativo, os registros nesta tabela podem aumentar significativamente. Assim, precisamos ter cuidado ao consultar o DMV.

Examinando os comandos DMV antes de trabalhar com o banco de dados TempDB


sys.dm_file_space_usage

Podemos obter algumas descrições desses DMVs na documentação da Microsoft.

A Tabela 1 mostra a descrição de sys.dm_file_space_usage . A consulta na Listagem 1 exibe o uso do espaço no arquivo para os bancos de dados TempDB e WideWorldImporters, respectivamente. As figuras 1 e 2 retornam as saídas dessa consulta com os bancos de dados TempDB e WideWorldImporters, respectivamente.

[ID da tabela=44 /]

Tabela 1:descrição 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 Saída da consulta em sys.dm_file_space_usage (WideWorldImporters)

Observe que a coluna total_page_count mostra o tamanho exato do arquivo de banco de dados em questão. Além disso, os tipos de arquivo LOG e FILESTREAM não são exibidos. Além disso, como esperado, allocated_extent_page_count corresponde ao espaço usado no arquivo de dados WWI_UserData.

Fig. 3 Tamanhos de arquivo no banco de dados WideWorldImporters



sys.dm_db_session_space_usage

A Tabela 2 mostra o uso da DMV sys.dm_db_session_space_usage. A Listagem 2 é a saída da consulta. Observe que o número de linhas retornadas corresponde ao número atual de sessões (ativas ou inativas) na instância. Além disso, lembre-se de que este DMV pertence APENAS ao TempDB.

[ID da tabela=45 /]

Tabela 2:descrição 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

A Tabela 3 mostra a implementação da DMV sys.dm_db_task_space_usage. A Listagem 3 exibe sua saída.

[ID da tabela=46 /]

Tabela 3:descrição 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;


Outras consultas DMV no MSSQL TempDB


Os outros dois DMVs parecem estar vazios antes que qualquer atividade do banco de dados seja executada. As Tabelas 4 e 5 mostram uma descrição de ambas as tabelas. Na próxima seção, veremos como os dados nos DMVs mudam quando geramos a atividade do banco de dados.

[ID da tabela=47 /]

Tabela 4:descrição de sys.dm_tran_active_snapshot_database_transactions

[ID da tabela=48 /]

Tabela 5:descrição de sys.dm_tran_version_store

Examinando o DMV após a conclusão da atividade do banco de dados


Vamos gerar alguma atividade.

Para fazer isso, execute as consultas simples na listagem 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 você pode ver, não há alocações ou desalocações significativas dessa pequena consulta, então elevamos o nível criando uma tabela temporária usando o script na Listagem 5.
-- Listing 5
use WideWorldImporters
go
select *
into [#Invoices]
from [Sales].[Invoices];
use tempdb
go
drop table [#Invoices];





Agora temos um número significativo de páginas alocadas e reservadas para nossa sessão ativa 62 (veja a Fig. 8). Além disso, preste atenção ao número significativo de extensões alocadas e páginas reservadas mostradas em sys.dm_db_file_space_usage (Fig. 9).







Quando vamos em frente e descartamos o Temptable #Invoice, vemos que as páginas alocadas no TempDB são liberadas conforme mostrado na Fig. 12. No entanto, a saída do DMV dm_db_session_space_usage ainda indica que algumas páginas estão alocadas para a sessão. Vemos que isso é liberado assim que fechamos a sessão (sessão ID 62).



Em seguida, abrimos outra sessão e criamos um índice usando as consultas da Listagem 6. Na Consulta 1 excluindo a opção SORT_IN_TEMPDB e na Consulta 2, usamos essa opção após descartar o índice. Nenhuma alocação significativa acontece para o primeiro caso, mas vemos algumas mudanças ao usar SORT_IN_TEMPDB. Esta mudança é muito pequena, dado o tamanho do índice em questão (ver Fig. 16 e 17).









Vamos realizar o teste final. Descobrimos que até este momento os DMVs como sys.dm_tran_active_snapshot_database_transactions e sys.dm_tran_version_store não retornam nenhuma linha quando consultados.

Vamos habilitar os níveis de isolamento SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT (Listagem 7). Uma vez feito, uma única instrução de atualização cria um registro no DMV sys.dm_tran_version_store. Colocar essa mesma consulta é uma transação que usamos para ver que um registro também é gerado no sys.dm_tran_active_snapshot_database_transactions durante a transação.


-- 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




Conclusão


Exploramos brevemente que podemos monitorar a atividade do TempDB usando cinco DMVs principais expostos pelo SQL Server. Ao usar esse nível do processo de monitoramento em um ambiente de produção, podemos determinar se precisamos de mais espaço no TempDB e nos arquivos de dados. Além disso, podemos analisar o impacto do isolamento SNAPSHOT se tivermos ativado esse recurso antes.

Os dados de saída desses DMVs também podem ser úteis para mostrar claramente aos desenvolvedores de aplicativos o impacto de seu comportamento de código no tempDB e na instância como um todo. No geral, é bastante gratificante entender o uso desses DMVs como um DBA preocupado com desempenho e gerenciamento de espaço.

Referências


Isolamento de instantâneo no SQL Server
Usando vários conjuntos de resultados ativos
Descrição de sys.dm_tran_version_store
Descrição de sys.dm_db_task_space_usage
Descrição de sys.dm_file_space_usage
Descrição de sys.dm_db_session_space_usage
Descrição de sys.dm_tran_active_snapshot_database_transactions