Inserimento in blocco parallelo con SqlBulkCopy e Azure

azure azure-sql-database database parallel-processing sqlbulkcopy

Domanda

Ho un'app azzurra sul cloud con un database sql azure. Ho un ruolo di lavoratore che deve eseguire l'analisi + elaborazione su un file (fino a ~ 30 milioni di righe), quindi non posso utilizzare direttamente BCP o SSIS.

Attualmente sto usando SqlBulkCopy, tuttavia questo sembra troppo lento perché ho visto tempi di caricamento fino a 4-5 minuti per 400k righe.

Voglio eseguire i miei inserti in serie in parallelo; tuttavia, leggendo gli articoli sull'importazione di dati nel comportamento di blocco in parallelo / controllo, si dice che SqlBulkCopy richiede che la tabella non abbia indici cluster e che sia necessario specificare un tablelock (blocco BU). Tuttavia, le tabelle azzurre devono avere un indice cluster ...

È persino possibile utilizzare SqlBulkCopy in parallelo sulla stessa tabella in SQL Azure? Se no c'è un'altra API (che posso usare nel codice) per fare questo?

Risposta accettata

Non vedo come è possibile eseguire più velocemente rispetto all'utilizzo di SqlBulkCopy. Sul nostro progetto possiamo importare file 250K in circa 3 minuti, quindi il tuo tasso sembra corretto.

Non penso che farlo in parallelo sarebbe d'aiuto, anche se fosse tecnicamente possibile. Eseguiamo solo 1 importazione alla volta altrimenti SQL Azure inizia a temporizzare le nostre richieste.

In effetti, a volte, eseguire una query di gruppo di grandi dimensioni contemporaneamente all'importazione non è possibile. SQL Azure fa molto lavoro per garantire la qualità del servizio, questo include il timeout delle richieste che richiedono troppo tempo, richiedono troppe risorse, ecc.

Quindi fare diversi inserti di grandi dimensioni alla stessa ora probabilmente causerà un time out.


Risposta popolare

È possibile eseguire SQLBulkCopy in parallelo contro SQL Azure, anche se si carica la stessa tabella. È necessario preparare i record in batch manualmente prima di inviarli all'API di SQLBulkCopy. Questo è assolutamente d'aiuto per le prestazioni e ti consente di controllare le operazioni di retry per un batch di record più piccolo quando ti limiti a causa di ragioni esterne al tuo.

Dai un'occhiata al mio post sul blog confrontando i tempi di caricamento di vari approcci. C'è anche un codice di esempio. In test separati sono riuscito a dimezzare il tempo di caricamento di un tavolo.

Questa è la tecnica che sto usando per un paio di strumenti (Enzo Backup, Enzo Data Copy); Non è una cosa semplice da fare, ma una volta fatto correttamente è possibile ottimizzare significativamente i tempi di caricamento.



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é