Database

Como identificar os bancos de dados com maior uso de CPU no SQL Server

Quando você possui um servidor de banco de dados que está tendo um alto consumo de CPU é necessário fazer um trabalho de investigação para identificar a origem desse consumo. Ou quando está querendo identificar quem são os maiores consumidores de recurso do seu servidor SQL. O SQL Server Management Studio (SSMS) não possui nenhum relatório específico para identificar isso, porém é possível fazer uma consulta SQL que traga a informação de uso de CPU para cada um dos seus bancos de dados.

Para isso execute a consulta:

SELECT T.[Database], T.[CPUTimeAsPercentage]
   FROM
    (SELECT 
        [Database],
        CONVERT (DECIMAL (6, 3), [CPUTimeInMiliSeconds] * 1.0 / 
        SUM ([CPUTimeInMiliSeconds]) OVER () * 100.0) AS [CPUTimeAsPercentage]
     FROM 
      (SELECT 
          dm_execplanattr.DatabaseID,
          DB_Name(dm_execplanattr.DatabaseID) AS [Database],
          SUM (dm_execquerystats.total_worker_time) AS CPUTimeInMiliSeconds
       FROM sys.dm_exec_query_stats dm_execquerystats
       CROSS APPLY 
        (SELECT 
            CONVERT (INT, value) AS [DatabaseID]
         FROM sys.dm_exec_plan_attributes(dm_execquerystats.plan_handle)
         WHERE attribute = N'dbid'
        ) dm_execplanattr
       GROUP BY dm_execplanattr.DatabaseID
      ) AS CPUPerDb
    )  AS T
ORDER BY T.[CPUTimeAsPercentage] DESC

O retorno da consulta será o nome do banco de dados seguido do seu consumo.

A consulta utiliza informação do plano de execução, ou seja, ela depende de informações de uso.

Descobrir o nome da constraint default de uma coluna no SQL Server

Quando se cria uma coluna com valor default no SQL Server, e não se define o seu nome, o SQL Server cria uma constraint para o default com um nome aleatório. Porém, se você precisar alterar algum atributo desta coluna, o SQL Server não deixará efetuar a alteração enquanto a constraint existir.

Para descobrir o nome da constraint referente ao default associada a determinada coluna execute a seguinte consulta.

SELECT OBJECT_NAME(cdefault)
  FROM dbo.syscolumns
 WHERE id = OBJECT_ID('NOME_TABELA')
   AND name = 'NOME_CAMPO'

 

Database

Obter os comandos mais custosos no SQL Server

Neste post vou falar como obter os comandos mais custosos em um determinado servidor SQL Server.

Muitas vezes a baixa performance de uma aplicação está relacionada ao banco de dados. E isto ocorre porque as consultas enviadas para o banco de dados não estão otimizadas, ou estão retornando mais dados que deveriam, ou até mesmo há uma mesma consulta sendo executava muitas vezes desnecessariamente.

Para identificar essas consultas ruins, é possível executar a query abaixo, que retornará os 10 piores comandos executados no SQL Server. Lembrando que o comando leva em consideração as estatísticas, ou seja, o comando irá funcionar somente se o banco de dados estiver em uso.

SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC -- logical reads
-- ORDER BY qs.total_logical_writes DESC -- logical writes
-- ORDER BY qs.total_worker_time DESC -- CPU time

É possível também alterar a ordenação da consulta, retornando os comandos mais custosos em relação a leitura, escrita ou tempo de CPU.

Há outras formas de identificar gargalos na aplicação, mas essa é uma ótima opção para iniciar os trabalhos de otimização.