nt-family: Arial"> 

capaSQL28.JPG

 

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                                                                                                                 ...

Quer ler esse conteúdo completo? Tenha acesso completo