Strane proliferazioni in statistiche (SQL Server 2005)

mercoledì 24 giugno 2009 - 12.37

palex Profilo | Newbie

Ho scoperto, mio malgrado, che creando ed eliminando indici (istruzioni CREATE INDEX e DROP INDEX) ad una tabella parrebbe che non sempre vengano eliminate le statistiche ad essi collegate.
In dettaglio, analizzando con Management Studio una qualsiasi tabella (nell'esempio è la tabella Province), mi trovo delle strane statistiche, che si chiamano, ad esempio:
_WA_Sys_00000003_3C69FB99 (sul campo prvLrgi)

e che sembrano dei "doppioni" sganciati dai precedenti indici, in quanto esiste anche la statistica
AK_Province_prvLrgi (sul campo prvLrgi)

associata all'indice
AK_Province_prvLrgi (non univoco, non cluster, sullo stesso campo)

creato apposta per la relazione FK
FK_Province_Regioni (Province.prvLrgi <-> Regioni.rgiCod)

Tutto probabilmente è causato da un automatismo di ricostruzione delle FK e degli indici ad esse collegate, che forse "toppa" da qualche parte. Nell'esempio soprastante, le istruzioni che vengono attivate sono le seguenti:

-- eliminazione della FK
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Province_Regioni]') AND parent_object_id = OBJECT_ID(N'[dbo].Province')) ALTER TABLE [dbo].Province DROP CONSTRAINT [FK_Province_Regioni]
-- eliminazione dell'AK collegata
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].Province') AND name = N'AK_Province_prvLrgi') DROP INDEX [AK_Province_prvLrgi] ON [dbo].Province WITH ( ONLINE = OFF )
-- creazione della FK
ALTER TABLE [dbo].Province WITH CHECK ADD CONSTRAINT [FK_Province_Regioni] FOREIGN KEY (prvLrgi) REFERENCES [dbo].Regioni (rgiCod) ON DELETE NO ACTION
ALTER TABLE [dbo].Province CHECK CONSTRAINT [FK_Province_Regioni]
-- creazione della AK collegata
CREATE NONCLUSTERED INDEX [AK_Province_prvLrgi] ON dbo.Province (prvLrgi ASC) ON [PRIMARY]

C'è qualcosa che posso fare per tenere sotto controllo queste strane proliferazioni nelle statistiche?
Grazie sin d'ora per l'aiuto.
---
Alessandro

lbenaglia Profilo | Guru

>C'è qualcosa che posso fare per tenere sotto controllo queste
>strane proliferazioni nelle statistiche?

Ciao Alessandro,

Le statischiche con prefisso _WA_Sys sono create automaticamente da SQL Server se è impostata ad ON la proprietà AUTO_CREATE_STATISTICS (impostazione di default).
In genere è consigliabile mantenere abilitata questa opzione in modo da "aiutare" il Query Optimizer a scegliere l'indice più opportuno durante la generazione del piano di esecuzione delle query.

Ad ogni modo se desideri disabilitare questa funzionalità, puoi eseguire il comando:

ALTER DATABASE [nome db] SET AUTO_CREATE_STATISTICS OFF WITH NO_WAIT

>Grazie sin d'ora per l'aiuto.
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

palex Profilo | Newbie

Grazie mille Lorenzo per la risposta.
Pensavo che la statistica connessa all'indice (già creata automaticamente con lo stesso nome dell'Index) fosse quella usata dal Query Optimizer.

In questo caso mi trovo comunque dei doppioni.
Mi piacerebbe tenere le statistiche attive per il Query Optimizer, ma evitare i doppioni...

lbenaglia Profilo | Guru

>Grazie mille Lorenzo per la risposta.
>Pensavo che la statistica connessa all'indice (già creata automaticamente
>con lo stesso nome dell'Index) fosse quella usata dal Query Optimizer.
Generalmente è così, ma SQL Server è in grado autogenerare nuove statistiche se "le ritiene utili" al fine di migliorare le prestazioni delle query.
In soldoni "mette una pezza" alla mancanza da parte del dba/db dev o all'evoluzione della base dati nel tempo.

>In questo caso mi trovo comunque dei doppioni.
Interessante...

>Mi piacerebbe tenere le statistiche attive per il Query Optimizer,
>ma evitare i doppioni...
Guarda, se vuoi un consiglio "lascia fare a SQL Server", lui è sicuramente più bravo di noi a capire cosa gli serve per lavorare al meglio

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5