Utilizando Views Dinâmicas para monitorar e melhorar a performance do SQL Server

Utilizar Dynamic Management Views (DMVs) é uma boa opção para monitorar o SQL Server. DMVs são uma coleção de views e funções de tabelas que habilitão você a obter informações sobre trabalhos internos do SQL Server. Vou comentar um pouco sobre DMVs.
DMVs é uma parte do schema sys na base master. Você pode localizar uma lsta de views dinâmicas pelo SQL Server Managemente Studio em “Master/Views/System Views”, e de dynamic functions em “Master/Functions/System Functions/Table-valued Functions”. Cada objeto dinâmico tem o prefixo como “dm_”.
O SQL Server 2005 introduziu as DMVs e o SQL Server 2008 incluiu DMVs adicionais. Com a ideia de qualquer usuário de banco, você pode consultar uma DMV em uma parte do banco e obter um resultado diferente se executar a mesma DMV em outra base/instância, mas o contexto permanece o mesmo.

DMVs: Uma alternativa a System Tables
Desde o SQL Server 2005, a Microsoft não autoriza modificações nos dados das system tables. Nas versões anteriores as system tables proviam uma das formas de recuperar metadata e em alguns casos, elas eram as únicas maneiras de resolver algumas tarefas mais complicadas. No SQL Server 2005 e 2008 você ainda pode executar querys nos objetos que tem o mesmo nome das system tables, mas agora esses objetos são system views.

DMVs proveem uma melhor alternativa para as system tables por diversos motivos:
– DMVs são dinâmicas por definição, seu conteúdo é alterado dinâmicamente pelo servidor.
– DMVs oferencem informações que antes eram difíceis ou até impossíveis de obter através de system tables, como contadores de performance ou comandos não documentados do DBCC.

DMVs podem ser classificadas pelo tipo de dados que elas retornam. Exemplo, SQL Server Operating System (SQLOS) DMVs retorna informações sobre memória, threads, contadores de performance, waits e outras informações de recursos utilizados, DMVs de transaction retorna detalhes sobre dados em trasações e locks, DMVs de SQL Server features traz informações sobre replicação, service broker, full-text search, database mirroring, etc.

Falta de Índices
Agora que vocês já devem estár mais confusos do que eu, vamos focar em um exemplo: falta de índices.
Se você já trabalhou em otimizar a performance de querys, você sabe que existem várias técnicas. Entretando, índices acabam sendo os mais efetivos para fazer uma query executar o mais rápido o possível. O SQL Server 2005 introduziu o missing indexes para ajudar a analisar informações sobre índices que PODERIAM melhorar a performance durante a execução de algumas querys.
Quando uma query é executada, o SQL Server Query Optimizer examina os índices existentes e considera a utilização deles ao invés de um table scan. Se um índice não existe, o SQL Server guarda essa informação sobre esse possível índice em uma DMVs. Você pode rever esses índices que não existem executando uma query.

O SQL Server 2005 dispõe das seguintes DMVs sobre missing index:
Sys.dm_db_missing_index_group_stats
Sys.dm_db_missing_index_groups
Sys.dm_db_missing_index_details
Sys.dm_db_missing_index_columns

Por exemplo, a query abaixo junta as informações das DMVs acima da forma mais benéfica o possível e traz o comando para criar o índice:

SELECT
avg_user_impact AS average_improvement_percentage,
avg_total_user_cost AS average_cost_of_query_without_missing_index,
‘CREATE INDEX ix_’ + [statement] +
ISNULL(equality_columns, ‘_’) +
ISNULL(inequality_columns, ‘_’) + ‘ ON ‘ + [statement] +
‘ (‘ + ISNULL(equality_columns, ‘ ‘) +
ISNULL(inequality_columns, ‘ ‘) + ‘)’ +
ISNULL(‘ INCLUDE (‘ + included_columns + ‘)’, ”)
AS create_missing_index_command
FROM sys.dm_db_missing_index_details a INNER JOIN
sys.dm_db_missing_index_groups b ON a.index_handle = b.index_handle
INNER JOIN sys.dm_db_missing_index_group_stats c ON
b.index_group_handle = c.group_handle
WHERE avg_user_impact > = 40

A query acima retorna qualquer índice que tenha um índice estimado de performance igual ou superior a 40%.
Você pode alterar a porcentagem alterando a última linha ou trocar o nome do índice de acordo com seus padrões.

Nota, como as DMVs são atualizadas dinâmicamente, as informações que forem recolhidas através dessa query não necessáriamente será a mesma se o SQL server for reiniciado.
As informações contidas nas DMVs são atualizadas desde o momento que o SQL server for iniciado.

Essa opção de criação de índices é muito usual mas, não é a solução perfeita. Os administradores tem que examinar e avaliar a real necessidade da criação dos índices.
Considerando que enquanto um índice pode melhorar a velocidade de um Select, ele pode ocasionar impactos em um Insert, Update ou Delete. Isso ocorre porque o SQL Server irá dedicar memória para manter os índices atualizados.