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

Utilização da CPU por banco de dados?


Tipo de. Confira esta consulta:
SELECT total_worker_time/execution_count AS AvgCPU  
, total_worker_time AS TotalCPU
, total_elapsed_time/execution_count AS AvgDuration  
, total_elapsed_time AS TotalDuration  
, (total_logical_reads+total_physical_reads)/execution_count AS AvgReads 
, (total_logical_reads+total_physical_reads) AS TotalReads
, execution_count   
, SUBSTRING(st.TEXT, (qs.statement_start_offset/2)+1  
, ((CASE qs.statement_end_offset  WHEN -1 THEN datalength(st.TEXT)  
ELSE qs.statement_end_offset  
END - qs.statement_start_offset)/2) + 1) AS txt  
, query_plan
FROM sys.dm_exec_query_stats AS qs  
cross apply sys.dm_exec_sql_text(qs.sql_handle) AS st  
cross apply sys.dm_exec_query_plan (qs.plan_handle) AS qp 
ORDER BY 1 DESC

Isso fará com que você obtenha as consultas no cache do plano na ordem de quanta CPU elas usaram. Você pode executar isso periodicamente, como em um trabalho do SQL Agent, e inserir os resultados em uma tabela para garantir que os dados persistam além das reinicializações.

Quando você ler os resultados, provavelmente perceberá por que não podemos correlacionar esses dados diretamente a um banco de dados individual. Primeiro, uma única consulta também pode ocultar seu verdadeiro pai de banco de dados fazendo truques como este:
USE msdb
DECLARE @StringToExecute VARCHAR(1000)
SET @StringToExecute = 'SELECT * FROM AdventureWorks.dbo.ErrorLog'
EXEC @StringToExecute

A consulta seria executada no MSDB, mas sondaria os resultados do AdventureWorks. Onde devemos atribuir o consumo de CPU?

Fica pior quando você:
  • Juntar entre vários bancos de dados
  • Execute uma transação em vários bancos de dados, e o esforço de bloqueio abrange vários bancos de dados
  • Execute trabalhos do SQL Agent no MSDB que "funcionam" no MSDB, mas faça backup de bancos de dados individuais

Continua e continua. É por isso que faz sentido ajustar o desempenho no nível da consulta em vez do nível do banco de dados.

No SQL Server 2008R2, a Microsoft introduziu recursos de gerenciamento de desempenho e gerenciamento de aplicativos que nos permitirão empacotar um único banco de dados em um pacote DAC distribuível e implantável, e são recursos promissores para facilitar o gerenciamento do desempenho de bancos de dados individuais e seus aplicativos. Ele ainda não faz o que você está procurando, no entanto.

Para mais, confira o Repositório T-SQL no wiki do SQL Server do Toad World (anteriormente em SQLServerPedia) .

Atualizado em 29/01 para incluir números totais em vez de apenas médias.