Io non sono un DBA ("! Good", ti verrà pensando in un momento.)Raggruppa l'indice sulla colonna datetime sempre crescente sulla tabella di registrazione?
Ho una tabella dei dati di registrazione con queste caratteristiche e modelli di utilizzo:
- Una colonna
datetime
per la memorizzazione di timestamp di registro il cui valore è sempre crescente e principalmente (ma solo per lo più) unico - Inserimenti frequenti (ad esempio, una dozzina di minuti), solo alla fine dell'intervallo di data/ora (nuovi dati registrati
- Elimina raramente, alla rinfusa, fr om il inizio del campo timestamp (vecchi dati che vengono cancellati)
- Nessun aggiornamento a tutti i
- seleziona frequenti-ish che utilizzano la colonna timestamp come criterio primario, insieme con criteri secondari su altre colonne
- Seleziona infrequenti utilizzando altre colonne come i criteri (e non tra cui la colonna timestamp)
- Una buona quantità di dati, ma in nessun posto vicino abbastanza che mi preoccupa molto di spazio di archiviazione
Inoltre, attualmente esiste una finestra di manutenzione giornaliera durante la quale è possibile eseguire l'ottimizzazione della tabella.
Francamente non mi aspetto che questa tabella sfidi il server su cui si accederà anche se indicizzo male un po ', ma tuttavia mi è sembrata una buona opportunità per chiedere un input sugli indici cluster di SQL Server.
So che gli indici cluster determinano la memorizzazione dei dati della tabella effettiva (i dati sono memorizzati nei nodi foglia dell'indice stesso) e che gli indici non in cluster sono indicatori separati nei dati. Quindi, in termini di query, un indice cluster sarà più veloce di un indice non in cluster - una volta che abbiamo trovato il valore dell'indice, i dati sono proprio lì. Ci sono costi per l'inserimento e l'eliminazione (e ovviamente un aggiornamento che modifica il valore della colonna dell'indice clustered sarebbe particolarmente costoso).
Ma ho letto in this answer che elimina gli spazi vuoti che non vengono ripuliti fino a/a meno che l'indice non venga ricostruito.
Tutto questo mi fa pensare che avrei dovuto:
- Mettere un indice cluster sulla colonna timestamp con un fattore di riempimento 100%
- indici non cluster mettere su qualsiasi altra colonna che potrebbe essere utilizzato come criterio in una query che non coinvolge anche la colonna in cluster (che può essere qualsiasi di esse nel mio caso)
- Pianificare le eliminazioni di massa che si verificano durante l'intervallo di manutenzione giornaliera
- Pianificare una ricostruzione del cluster indice che si verifica immediatamente dopo il bulk de Lete
- rilassarsi e di più
Am I di base selvaggiamente fuori là? Devo ricostruire frequentemente l'indice in questo modo per evitare un sacco di spazio sprecato? Ci sono altre cose ovvie (a un DBA) che dovrei fare?
Grazie in anticipo.
Suggerisco solo di fare attenzione all'uso di "timestamp" per descrivere una colonna datetime. In SQL Server, il termine "timestamp" è stato vittima di essere assegnato a un tipo di dati che non ha nulla a che fare con la data o l'ora, chiamato ROWVERSION. Dato che questo può sempre innescare confusione, abituarmi ad evitare questo termine, anche quando intendi davvero una colonna ROWVERSION. Purtroppo gli stessi strumenti di SQL Server non lo incoraggiano davvero, infatti quando crei una colonna ROWVERSION, lo script finisce per mostrarti TIMESTAMP. –
@Aaron: Doh! Buon punto, grazie. Sulla base di ciò stavo per tornare indietro e modificare, ma si è trasformato in un disastro. Spero che grazie al tuo commento le persone non lo leggeranno male. –