Statistiche di aggiornamento automatico non aggiornate


8

Sto usando SQL SERVER 2012ho il mio Auto Update Stats ON nel mio database.

Dal link di seguito ho appreso che, le statistiche di aggiornamento automatico verranno attivate per ogni SQRT(1000 * Table rows)modifica delle righe della tabella. https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/

Ho creato una tabella con 1000 record

SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                name
INTO   stst
FROM   sys.objects 

Creare statistiche

CREATE STATISTICS rn  
    ON stst (rn)  

CREATE STATISTICS name  
    ON stst (name)  

Verifica delle statistiche create

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

Secondo la formula

select SQRT(1000 * 500) -- 707.106781186548

Quindi, se aggiungo / modifico i 707.106781186548record nella mia tabella, le statistiche di aggiornamento automatico dovrebbero attivarsi

Aggiungi 1000più record al mio tavolo che dovrebbe essere più che sufficiente per sparareauto update stats

INSERT INTO stst(rn,name)
SELECT TOP 1000 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                a.name
FROM   sys.objects a 

Per sparare al auto update stats

Select * from stst

Verifica delle statistiche

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

Purtroppo ancora Rowsè 500unica.

Anche dopo aver inserito i 1000record nella mia tabella che è ovviamente maggiore rispetto a 707.106781186548quando si eseguono i SELECTmotivi per cui le statistiche di Auto Update non si sono attivate? Cosa mi sto perdendo qui


7
Ti stai perdendo un paio di cose. Il calcolo migliorato viene utilizzato solo nelle versioni precedenti al 2016 se è attivato Trace Flag 2371. Le statistiche non si aggiornano quando i dati vengono modificati, si aggiornano dopo che i dati sono stati modificati e una query deve usarli (supponendo che abbiano raggiunto la soglia di modifica).
Erik Darling,

7
Anche una query banale (ad esempio SELECT * senza una clausola WHERE) non attiverà un aggiornamento delle statistiche. Prova a eseguire una query che induca effettivamente il motore a fare qualcosa in cui le statistiche potrebbero essere utili (ad es. Uguaglianza o intervallo nella colonna chiave principale).
Aaron Bertrand

2
@sp_BlitzErik Grazie per le informazioni su Trace Flag non lo so mai ..
P ரதீப்

3
Non sentirti stupido, ho imparato qualcosa dalle risposte alla tua domanda. E sono d'accordo che @sp_BlitzErik e / o AaronBertrand dovrebbero pubblicare le loro risposte.
SqlZim,

8
Lascerò @AaronBertrand pubblicare il suo come risposta. Poteva usare i punti.
Erik Darling,

Risposte:


11

Il nuovo calcolo viene utilizzato solo se il flag di traccia 2371 è abilitato, ad eccezione di SQL Server 2016 quando il livello di compatibilità del database di contesto è impostato su 130, dove è il comportamento predefinito. Vedi Microsoft KB 2754171:

Controllo del comportamento di Autostat (AUTO_UPDATE_STATISTICS) in SQL Server

Le statistiche non vengono aggiornate quando i dati vengono modificati. Un aggiornamento delle statistiche viene attivato quando l' ottimizzazione basata sui costi rileva che statistiche interessanti per la query sono obsolete.

L'ottimizzatore non inserisce l'ottimizzazione basata sui costi per query molto semplici ("banali"), in cui un singolo piano ovvio è sempre ottimale. Non si verificano aggiornamenti statistici in quello scenario.

Consulta il White paper sul piano di memorizzazione nella cache e la ricompilazione di Microsoft in SQL Server 2012 di Greg Low.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.