Identificare gli eventi di crescita dei file


9

Sto scoprendo un certo numero di DB nel mio portafoglio che sono stati creati con impostazioni di crescita automatica predefinite (incrementi di 1 MB o 10%) che si sono espanse per un lungo periodo di tempo. Se volessi ottenere un indicatore della quantità di frammentazione esterna per ciascuno dei file DB, posso ottenere dai metadati quante volte un file DB è stato modificato nelle dimensioni (tramite scansione automatica o manuale)? Per chiarire, posso ottenere dai metadati la cronologia delle modifiche al file DB per la durata del DB, non solo dal riavvio dell'istanza?


1
A meno che non siano stati anche ridotti a un certo punto, questo dovrebbe essere un semplice calcolo dalla dimensione iniziale alla dimensione corrente in base all'impostazione di crescita automatica?
Martin Smith,

Se fosse stato modificato solo da autogrow, sarei d'accordo ma ho visto apportate modifiche manuali che potrebbero essere al di fuori delle impostazioni di autogrow.
MattyZDBA,

Risposte:


20

È possibile ottenere informazioni sugli eventi di crescita automatica dalla traccia predefinita se è abilitato:

select distinct
    ei.eventid,
    e.name
from sys.fn_trace_geteventinfo(1) ei
inner join sys.trace_events e
on e.trace_event_id = ei.eventid
where name like '%grow%';

Da questo si può vedere che la traccia predefinita ha l' acquisizione degli eventi di crescita automatica del file di dati e crescita automatica del file di registro . Per vedere se la traccia predefinita è abilitata su quell'istanza, puoi fare quanto segue:

exec sp_configure 'default trace enabled';
go

Nota: questa è un'opzione di configurazione avanzata, quindi show advanced optionsdovrebbe essere impostata su 1 per visualizzare questa opzione di configurazione sp_configure. Inoltre, questi due eventi non verranno attivati ​​se il file è cresciuto manualmente .

Ecco una rapida query di esempio per ottenere questi eventi:

select
    te.name as event_name,
    tr.DatabaseName,
    tr.FileName,
    tr.StartTime,
    tr.EndTime
from sys.fn_trace_gettable('<Trace Path>', 0) tr
inner join sys.trace_events te
on tr.EventClass = te.trace_event_id
where tr.EventClass in (92, 93)
order by EndTime;

E puoi ottenere <Trace Path>dalla funzione di sistema sys.fn_trace_getinfo:

select *
from sys.fn_trace_getinfo(1);

Questa è una buona informazione, basta tenere presente che alcuni di quegli eventi potrebbero essere scaduti dalla traccia predefinita.
Nic,

Assolutamente, ma credo che sia l'unico monitoraggio immediato che l'OP riuscirà a fare effettivamente il corretto controllo.
Thomas Stringer,
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.