Riassumendo le specifiche: è necessario inserire circa 5 milioni di righe in un database del fornitore (Oracle). Tutto va benissimo per i batch di 500k righe utilizzando OracleBulkCopy
(ODP.NET), ma quando proviamo a scalare fino a 5M, le prestazioni iniziano a rallentare a una scansione quando raggiunge il segno 1M, diventano progressivamente più lente man mano che vengono caricate più righe e, infine, timeout dopo circa 3 ore.
Ho il sospetto che sia correlato a una chiave primaria sul tavolo, ma ho esplorato i forum Oracle e Stack Overflow per informazioni e molto di ciò che sto leggendo contraddice che (anche molti post sembrano contraddirsi a vicenda ) . Spero che qualcuno possa mettere le cose in chiaro su alcune domande strettamente correlate sul processo:
La
OracleBulkCopy
classe utilizza il caricamento convenzionale o diretto? C'è un modo per confermare questo, in un modo o nell'altro?Supponendo che fa diretta-path uso di carico: E 'vero che Oracle imposta automaticamente tutti gli indici a inutilizzabili durante il carico e li mette di nuovo online dopo? Ho letto diverse dichiarazioni in tal senso ma, ancora una volta, non posso confermarlo.
Se il numero 2 è vero, allora dovrebbe fare la differenza quali indici sono sul tavolo prima di iniziare un'operazione di copia in blocco? Se è così, perché?
Relativamente al n. 3, c'è qualche differenza pratica, in generale, tra il caricamento di massa con un indice inutilizzabile rispetto al fatto di far cadere l'indice prima del carico e ricrearlo in seguito?
Se il n. 2 non è corretto o se ci sono alcuni avvertimenti che non capisco, farebbe qualche differenza rendere esplicitamente inutilizzabile l'indice prima del caricamento di massa, e poi ricostruirlo esplicitamente in seguito?
C'è qualcos'altro, oltre alle build dell'indice, che potrebbe far rallentare progressivamente un'operazione di copia in blocco man mano che vengono aggiunti sempre più record? (Forse qualcosa a che fare con la registrazione, anche se mi aspetterei che le operazioni di massa non vengano registrate?)
Se in realtà non c'è altro modo per ottenere le prestazioni da snuff oltre a eliminare prima il PK / indice, quali passi posso fare per assicurarmi che l'indice non scompaia completamente, cioè se si perde la connessione al database nel mezzo del processo?