Ok, para exemplificar vamos pegar como exemplo a tabela Person.Contact do banco de dados AdventureWorks. Para saber todos os índices desta tabela podemos executar a procedure de sistema sp_helpindex…correto? Correto! Então ao executar a procedure temos o seguinte:
sp_helpindex
[Person.Contact]index_name index_description index_keys
AK_Contact_rowguid nonclustered, unique located on PRIMARY rowguid
IX_Contact_EmailAddress nonclustered located on PRIMARY EmailAddress
PK_Contact_ContactID clustered, unique, primary key located on PRIMARY ContactID
Podemos ver que a tabela possui 3 índices, sendo 1 CLUSTERED (PK_Contact_ContactID) e 2 NONCLUSTERED. Porém como cito
no início, usando a sp_helpindex nós não temos como saber se um dos índices NONCLUSTERD foi criado usando a cláusula INCLUDE e consequentemente possui outros colunas no índice.
Isso fica claro se usarmos a isntrução abaixo para alterar o índice IX_Contact_EmailAddress e incluir a coluna FirstName como INCLUDE…
CREATE
INDEX IX_Contact_EmailAddress ON Person.Contact (EmailAddress) INCLUDE (FirstName) WITH (DROP_EXISTING =ON)Ao executarmos a sp_helpindex novamente, verá que temosexatamente o mesmo resultado da primeira execução.
Então vem a pergunta: Como fazer para saber se um índice possui outras colunas como INCLUDE? Bom, neste caso você pode reescrever a procedure sp_helpindex ou ainda usar as DMVs do SQL Server 2005.
Quanto a reescrever a sp_helpindex, não perca tempo pois a MVP Kimberly Tripp já fez isso para você, basta ler o artigo sp_helpindex2 to show included columns e baixar o script na faixa. Inclusive com versão para o SQL 2005 e SQL 2008.
Quanto a usar DMVs, o script abaixo é tudo o que você precisa. Ao executá-lo você verá se os índices possuem outras colunas como INCLUDE. No nosso exemplo, a coluna “colum usage” que lhe indica que a coluna FirstName está como INCLUDE para o índice IX_Contact_EmailAddress.
— Verifica se coluna está como INCLUDE
FROM sys.index_columns ic JOIN sys.columns c
ON ic.object_id = c.object_id
AND ic.column_id = c.column_id JOIN sys.indexes i
ON i.object_id = ic.object_id AND i.index_id = ic.index_id
WHERE ic.object_id = object_id(‘Person.Contact’)
Usando nosso exemplo da tabela Person.Contact, temos o seguinte resultado:
object_name index_name column column usage
———— ————————– ———————— ————
Contact PK_Contact_ContactID ContactID KEY
Contact AK_Contact_rowguid rowguid KEY
Contact IX_Contact_EmailAddress EmailAddress KEY
Contact IX_Contact_EmailAddress FirstName INCLUDED
Contact PXML_Contact_AddContact AdditionalContactInfo KEY
Bom, agora ficoou fácil certo?
Abraços
Nilton Pinheiro

