Prestazioni SqlBulkCopy

c# sqlbulkcopy sql-server

Domanda

Sto lavorando per aumentare le prestazioni dei carichi alla rinfusa; 100 di milioni di record + ogni giorno.

L'ho spostato per utilizzare l'interfaccia IDatareader al posto delle tabelle di dati e ho ottenuto un notevole aumento delle prestazioni (500.000 nuovi record al minuto). La configurazione corrente è:

  • Un lettore memorizzato nella cache per analizzare i file delimitati.
  • Avvolgere il lettore di stream in un flusso bufferizzato.
  • Una classe di lettore oggetti personalizzata che enumera gli oggetti e implementa l'interfaccia IDatareader .
  • Quindi SqlBulkCopy scrive sul server

La maggior parte del collo della bottiglia delle prestazioni è direttamente in SqlBulkCopy.WriteToServer . Se l'unità verifica il processo fino a escludere solo WriteToServer il processo ritorna in circa 1 minuto. WriteToServer richiede altri 15 minuti +. Per il test dell'unità è sul mio computer locale, quindi la stessa unità su cui è presente il database, quindi non deve copiare i dati attraverso la rete.

Sto usando una tabella heap (senza indici, cluster o non cluster, ho giocato a vari batch senza grandi differenze nelle prestazioni).

È necessario ridurre i tempi di caricamento, quindi spero che qualcuno possa ora spremere un po 'più di sangue da questo aumento.

Risposta accettata

Perché non utilizzare SSIS direttamente?

Ad ogni modo, se hai fatto un trucking da parsing a IDataReader sei già sulla strada giusta. Per ottimizzare SqlBulkCopy, è necessario attivare lo stato attivo su SQL Server. La chiave è operazioni minimamente registrate. È necessario leggere questi articoli MSDN:

Se il tuo obiettivo è un B-Tree (cioè una tabella indicizzata in cluster), sfortunatamente uno dei più importanti principi dell'inserto bulk performante, vale a dire il set di righe di input ordinato, non può essere dichiarato. Sis semplice come questo, ADO.Net SqlClient non ha l'equivalente di SSPROP_FASTLOADOPTIONS -> ORDER(Column) (OleDb). Poiché il motore non sa che i dati sono già ordinati, nel piano verrà aggiunto un operatore di ordinamento che non è poi così male, tranne quando si rovescia. Per evitare fuoriuscite, utilizzare una piccola dimensione del lotto (~ 10k). Vedere il mio punto originale: tutte queste sono solo opzioni e clic per impostare in SSIS piuttosto che scavare attraverso OleDB MSDN spec ...

Se il tuo flusso di dati non è ordinato per iniziare o se la destinazione è un heap, il mio punto sopra è muto.

Tuttavia, il raggiungimento di un livello minimo di registrazione è ancora un must per prestazioni decenti.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché