nt-family: Arial">
Clique aqui para ler todos os artigos desta edição
Index Tuning Wizard
Valide, drope ou crie novos índices com a ferramenta de tuning da Microsoft
Paulo Ribeiro
Grande parte dos problemas de desempenho se deve à inexistência de índices adequados para as queries. Mas o que vem a ser um “índice adequado”? Um bom índice deve reduzir o volume de I/O necessário para execução da query. Um bom índice deve também “ajudar mais” do que “atrapalhar”, sendo efetivamente utilizado pelas queries.
O objetivo dessa matéria será apresentar ao leitor o Index Tuning Wizard, ferramenta embutida no SQL Server 2000 para análise de queries, cujo propósito é recomendar a criação ou exclusão de índices para otimização de performance.
Um bom índice é...
Conhecem aquele ditado: um é bom, dois é ótimo, mas três pode ser demais? Pois bem, uma tabela sem índices é péssima, mas a abundância de índices pode não ser um bom negócio - principalmente se os índices não são utilizados.
Índices e estatísticas foram discutidos nas edições 9 e 10 (“Estatísticas de Distribuição de Dados no SQL Server” e “Entendendo e Utilizando Índices na Otimização de Queries”); faremos aqui apenas um exemplo prático.
Exemplo prático de tuning envolvendo a criação de índice
Os índices da tabela Orders, localizada no database Northwind, encontram-se na Listagem 1. Repare no índice em destaque ix_EmployeeId, criado sobre a coluna de EmployeeId.
Listagem 1. Indices existentes na tabela Orders.
use NorthWind
go
exec sp_helpindex orders
go
-----------------------------------------------------------------------------------------
index_name index_description index_keys
-------------- ----------------------------------------------- --------------
ix_CustomerID nonclustered located on PRIMARY CustomerID
ix_EmployeeID nonclustered located on PRIMARY EmployeeID
ix_OrderDate nonclustered located on PRIMARY OrderDate
PK_Orders clustered, unique, primary key located on PRIMARY OrderID
ix_ShippedDate nonclustered located on PRIMARY ShippedDate
ix_ShippersOrders nonclustered located on PRIMARY ShipVia
ix_ShipPostalCode nonclustered located on PRIMARY ShipPostalCode
O comando SELECT da Listagem 2 está filtrando os clientes cujos pedidos foram atendidos pelo empregado de código 4. Note que o índice ix_EmployeeId não está sendo utilizado, fato que pode ser confirmado pelo processo de scan ( varredura seqüencial) no índice cluster.
Listagem 2. SELECT com clustered index scan na tabela Orders.
set showplan_text on
set statistics_io on
go
select employeeId, customerId
from orders
where employeeid=4
go
---------------------------------------------------------------------------------------------------
StmtText
-----------------------------------------------------------------
select employeeId, customerId
from orders
where employeeid=4
StmtText ...