SQL SERVER – Duplicated Indexes
Para analisar a performance de uma base de dados esta script é um bom ponto de partida.
Por vezes a evolução dos sistemas obriga à criação de novos índices mas a validação de se alguns destes não são necessário ficam esquecida.
Um dos grandes motivos para a duplicação de índices tem a ver com a evolução do motor do SQL.
Exemplo:
Índice com os campos: Campo1 e Campo2
- CREATE INDEX IX_TABELA_Campo1_Campo2 ON dbo.[TABELA]
Cenário 1 – Uso do filtro nos campo1 e campo2:
- SELECT * FROM TABELA WHERE Campo1= ‘A’ AND Campo2 = ‘B’
- SELECT * FROM TABELA WHERE Campo2= ‘B’ AND Campo1 = ‘A’
- Nestes casos o índice usado
Cenário 2 – Uso do filtro campo1:
- SELECT * FROM TABELA WHERE Campo1= ‘A’
- Neste caso o indice usado
Cenário 3 – Uso do filtro campo2:
- SELECT * FROM TABELA WHERE Campo2= ‘B’
- Neste caso o indice não é usado
Avalie também os índices em falta, “Missing Index Script”.
WITH Duplicated AS
(
SELECT TableName = S.[name] + '.' + O.[name]
, IndexName = I.[name]
, Col01 = INDEX_COL(S.[name] + '.' + O.[name], I.index_id, 1)
, Col02 = INDEX_COL(S.[name] + '.' + O.[name], I.index_id, 2)
, Col03 = INDEX_COL(S.[name] + '.' + O.[name], I.index_id, 3)
, Col04 = INDEX_COL(S.[name] + '.' + O.[name], I.index_id, 4)
, Col05 = INDEX_COL(S.[name] + '.' + O.[name], I.index_id, 5)
, Col06 = INDEX_COL(S.[name] + '.' + O.[name], I.index_id, 6)
, Col07 = INDEX_COL(S.[name] + '.' + O.[name], I.index_id, 7)
, Col08 = INDEX_COL(S.[name] + '.' + O.[name], I.index_id, 8)
, Col09 = INDEX_COL(S.[name] + '.' + O.[name], I.index_id, 9)
, Col10 = INDEX_COL(S.[name] + '.' + O.[name], I.index_id, 10)
FROM sys.indexes I
INNER JOIN sys.objects O ON I.[object_id] = O.[object_id]
INNER JOIN sys.schemas S ON S.[schema_id] = O.[schema_id]
WHERE index_id > 0
)
SELECT D1.TableName
, D1.IndexName
, D1.Col01
, D1.Col02
, D1.Col03
, D1.Col04
, D1.Col05
, D1.Col06
, D1.Col07
, D1.Col08
, D1.Col09
, D1.Col10
FROM Duplicated D1
INNER JOIN Duplicated D2 ON D1.TableName = D2.TableName
AND D1.IndexName <> D2.IndexName
AND D1.Col01 = D2.Col01
AND (D1.Col02 IS NULL OR D2.Col02 IS NULL OR D1.Col02 = D2.Col02)
AND (D1.Col03 IS NULL OR D2.Col03 IS NULL OR D1.Col03 = D2.Col03)
AND (D1.Col04 IS NULL OR D2.Col04 IS NULL OR D1.Col04 = D2.Col04)
AND (D1.Col05 IS NULL OR D2.Col05 IS NULL OR D1.Col05 = D2.Col05)
AND (D1.Col06 IS NULL OR D2.Col06 IS NULL OR D1.Col06 = D2.Col06)
AND (D1.Col07 IS NULL OR D2.Col07 IS NULL OR D1.Col07 = D2.Col07)
AND (D1.Col08 IS NULL OR D2.Col08 IS NULL OR D1.Col08 = D2.Col08)
AND (D1.Col09 IS NULL OR D2.Col09 IS NULL OR D1.Col09 = D2.Col09)
AND (D1.Col10 IS NULL OR D2.Col10 IS NULL OR D1.Col10 = D2.Col10)
ORDER BY D1.TableName, D1.IndexName
GO