7

Ho notato un cambiamento di prestazioni interessante che si verifica attorno a 1,5 milioni di valori immessi. Qualcuno può darmi una buona spiegazione del perché questo sta accadendo?Server Sql 2008 R2 Inserimenti DC Inserimento delle prestazioni

La tabella è molto semplice. È composto da (bigint, bigint, bigint, bool, varbinary (max)) Ho un indice pk clusered sui primi tre bigin. Inserisco solo "true" booleano come data varbinary (max).

Da quel punto in poi, le prestazioni sembrano piuttosto costanti.

Legenda: Y (Tempo in ms) | X (Inserti 10K)

enter image description here

Sono anche curiosità riguardo costante relativamente piccola (a volte molto grande) picchi ho sul grafico.

Piano di esecuzione effettivo dai precedenti picchi.

Actual Execution Plan from before spikes

Legenda:
Tabella sto inserendo nel: TSMDataTable
1. BigInt DataNodeID - FK
2. BigInt TS - timestapm principale
3. BigInt CTS - modifica timestamp
4 Bit: ICT: registra l'ultimo valore inserito (aumenta le prestazioni di lettura)
5. Dati: Dati
Valore bool Ora attuale MPL mantiene

enviorment
È locale.
Non condivide alcuna risorsa.
È un database di dimensioni fisse (sufficiente per non espandersi).
(Computer, 4 core, 8GB, 7200rps, Win 7).
(SQL Server 2008 R2 DC, Affinità processori (core 1,2), 3GB,)

+1

i picchi presumibilmente saranno lo SQL lazy writer –

+0

BTW, un indice cluster su 3 bigints è una cattiva idea. –

+1

Perché è quello? Cosa vorresti proporre? – Falcon

risposta

1

Avete controllato il piano di esecuzione una volta che il tempo passa in su? Il piano potrebbe cambiare in base alle statistiche. Dal momento che i tuoi dati crescono rapidamente, le statistiche cambieranno e questo potrebbe innescare un piano di esecuzione diverso.

I cicli nidificati fanno bene a piccole quantità di dati, ma come potete vedere, il tempo aumenta con il volume. L'SQL Query Optimizer quindi passa probabilmente a un piano di hashing o di unione che è coerente per grandi volumi di dati.

Per confermare rapidamente questa teoria, provare a disabilitare l'aggiornamento automatico delle statistiche ed eseguire nuovamente il test. Non dovresti vedere il "bernoccolo" allora.

EDIT: Dal momento che Falcon ha confermato che le prestazioni sono cambiate a causa delle statistiche, possiamo elaborare i prossimi passi.

Immagino che tu faccia un inserto uno per uno, corretto? In tal caso, se non è possibile inserire bulk, sarà molto meglio inserirli in una tabella di lavoro heap, quindi a intervalli regolari spostare le righe in blocco nella tabella di destinazione. Questo perché per ogni riga inserita, SQL deve controllare duplicati chiave, chiavi esterne e altri controlli e ordinare e dividere le pagine tutto il tempo.Se ti puoi permettere di posticipare questi controlli per un po 'più tardi, credo che otterrai una prestazione eccellente.

Ho usato questo metodo per la registrazione delle metriche. La registrazione andrebbe in una tabella di heap normale senza indici, senza chiavi esterne, senza controlli. Ogni dieci minuti creo una nuova tabella di questo tipo, quindi con due "sp_rename" all'interno di una transazione (swift swap). Rendo disponibile l'intera tabella per l'elaborazione e la nuova tabella prende la registrazione. Allora hai il conforto di fare tutto il controllo, lo smistamento, la suddivisione solo una volta, alla rinfusa.

A parte questo, non sono sicuro di come migliorare la situazione. È certamente necessario aggiornare regolarmente le statistiche poiché questa è la chiave per una buona prestazione in generale.

Potrebbe tentare di utilizzare una singola chiave cluster di identità di colonna e un indice univoco aggiuntivo su quelle tre colonne, ma sono dubbioso che sarebbe di grande aiuto.

Potrebbe provare a riempire gli indici, se i dati inseriti non sono sequenziali. Ciò eliminerebbe l'eccessiva divisione delle pagine, mescolamento e frammentazione. Avrai bisogno di mantenere il padding regolarmente che potrebbe richiedere un tempo di pausa.

Potrebbe cercare di dargli un aggiornamento HW. Avrai bisogno di capire quale componente è il collo di bottiglia. Potrebbe essere la CPU o il disco, il mio preferito in questo caso. La memoria non è probabile se hai uno per uno inserisce. Dovrebbe essere facile quindi, se non è la CPU (la linea appesa sopra il grafico), è molto probabile che il tuo IO ti trattiene. Prova un controller migliore, un disco migliore e più veloce ...

+0

Darò un'occhiata a questo e ti faccio sapere cosa ho trovato. – Falcon

+1

L'ho provato, e dopo aver spento le statistiche, non ho visto il "bump". Durante i test i risultati sono stati molto coerenti e ho notato un aumento significativo delle prestazioni del 10%. – Falcon

+1

Molto bene Falcon :) felice. Ora sai cosa sta succedendo e potresti essere in grado di risolverlo;) Cercherò di dare qualche suggerimento modificando la mia risposta. – Rbjz