Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
555
Assunto : SQL Server
Titulo: Eliminando estatísticas desnecessárias

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



Todo banco que criamos tem, por default, as opções auto create statistics e auto update statistics. Essas opções fazem com que o SQL Server crie e atualize automaticamente estatísticas de distribuição de dados para campos que não possuem indice.

Isso é ótimo, sim, para garantir uma maior precisão nos planos de execução gerados a cada query executada no banco. Mas isso gera uma perda de performance nas atualizações de dados, pois a estatística também precisa ser atualizada.

Enquanto a perda em atualizações gera ganho em consultas, isso é ótimo. Mas quando re-organizamos a indexação do banco existe uma grande possibilidade de esquecermos diversas estatísticas de distribuição de dados que não sejam mais necessárias (os índices tem suas próprias estatisticas) e, neste caso, teremos perda de performance.

Desta forma é recomendável, especialmente depois de uma análise de indexação que envolva criação de novos índices, examinar a base de dados para verificar se existe alguma estatística de distribuição redundante.

Para isso criei o código abaixo. Esse código verifica se existe algum índice que esteja indexando exatamente a mesma tabela e mesmas chaves que uma estatística de distribuição de dados. Neste caso a estatística está desatualizada e precisa ser eliminada.

Veja o código :


Declare X cursor for select id, indid, name from sysindexes a
where INDEXPROPERTY ( id , name , 'IsStatistics' ) =1
and exists (select 1 from sysindexes b where b.id=a.id and
INDEXPROPERTY ( id , name , 'IsStatistics' ) =0)

declare @id bigint
declare @indid smallint
declare @name varchar(50)
declare @cnt1 tinyint
declare @cnt2 tinyint
declare @id2 bigint
declare @indid2 smallint

open x
fetch next from x into @id,@indid,@name
while @@fetch_Status=0
begin
select @cnt1=count(*) from sysindexkeys where id=@id and indid=@indid
declare y cursor for select id,indid from sysindexkeys where id=@id and indid<>@indid
group by id,indid having count(*)=@cnt1
open y
fetch next from y into @id2,@indid2
while @@fetch_status=0
begin
if not exists(select 1 from sysindexkeys a where id=@id and indid=@indid and
not exists(select 1 from sysindexkeys b where id=@id and indid=@indid2
and b.colid=a.colid))
begin
print 'Nome : ' + @name + ' tabela : ' + object_name(@id)
end

fetch next from y into @id2,@indid2
end
close y
deallocate y
fetch next from x into @id,@indid,@name
end
close x
deallocate x


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 11/27/2017 6:50:00 PM
nome: TuEokkqWofFD
email: jimosanil0c@hotmail.com
comentário:
XVTakO http://www.LnAJ7K8QSpfMO2wQ8gO.com

data: 1/31/2017 11:07:00 PM
nome: HazyqAgMzPF
email: derby451@hotmail.com
comentário:
2PGSXy http://www.y7YwKx7Pm6OnyJvolbcwrWdoEnRF29pb.com

data: 1/31/2017 11:01:00 AM
nome: CHGTqtedOSxqvKElaAf
email: derby451@hotmail.com
comentário:
mBpn6a http://www.y7YwKx7Pm6OnyJvolbcwrWdoEnRF29pb.com

data: 1/29/2017 10:07:00 PM
nome: NWoJnjDHIdZk
email: derby451@hotmail.com
comentário:
WDcGvJ http://www.y7YwKx7Pm6OnyJvolbcwrWdoEnRF29pb.com

data: 1/29/2017 9:05:00 PM
nome: KOsTWgiMxdmaSCbkCa
email: jogcbfn@hotmail.com
comentário:
VB3Nn0 http://www.y7YwKx7Pm6OnyJvolbcwrWdoEnRF29pb.com

 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br