Come ottimizzare l'importazione dei dati in SQL Server con 100000 record con 100s di utenti concorrenti

asp.net-mvc sqlbulkcopy sql-server

Domanda

Sto usando l'applicazione web di Visual Studio usando ASP.NET MVC e C #. Ho un file Excel di oltre 100000 record da importare in SQL Server 2008 R2.

Ho usato SqlBulkCopy con ado.net DataTable per copiare dati in una tabella ( Table1 ).

Quindi convalida ed elabora i dati e il contrassegno con valido / non valido.

Poi aggiungere e aggiornare i record di 3 tavoli ( Table2 , Table3 e Table4 ) da Table1 utilizzando una stored procedure.

Table4 contiene 2 trigger e utilizza il cursore per aggiornare diversi record ad esso Table4 all'interno di Table4 e un'altra tabella ( Table2 ).

Durante il test ci vuole 1 minuto per 10000 record dalla mia macchina locale con la modalità di debug.

Se 10 o 100 utenti importano allo stesso tempo, supporterebbe?

Esiste un processo migliore per migliorare e supportare molti utenti simultanei?

La mia configurazione del computer:

  • Windows 10 64 bit
  • Processore AMD FX QuardCore da 3,6 GHz
  • 8 GB di RAM

  • Il file Excel contiene 50 colonne

  • BulkCopy richiede 2 - 3 secondi
  • La procedura memorizzata impiega da 30 secondi a 2 minuti

Quando lo collaudo con 5 utenti simultanei, il processo 2 o 3 è stato eseguito correttamente e ottengo questo errore:

La transazione (ID processo 66) era bloccata su blocco | risorse del buffer di comunicazione con un altro processo ed è stato scelto come vittima del deadlock. Rieseguire la transazione.

Risposta popolare

  1. Puoi disabilitare (o forse, eliminare e ricreare più tardi) gli indici durante l'importazione? Gli indici fissano la selezione ma rallentano Inserisci e aggiorna per tabelle grandi? Utilizzare MERGE invece di INSERT e UPDATE.

  2. Trova un'alternativa per il cursore (come CTE o while loop o MERGE statement) o usa il cursore FAST_FORWARD, se non lo stai già utilizzando.

  3. Come stai convalidando i dati. Questo passo è abbastanza veloce?

  4. Hai bisogno di trigger durante l'elaborazione di massa. Queste tabelle vengono utilizzate da qualche parte. Codice di attivazione che verrà eseguito per riga, è possibile eseguirlo in un batch in un processo di importazione in blocco. Esiste un'opzione per disattivare i trigger in Sql. Controlla se questo è adatto al tuo scopo.

  5. I pacchetti SSIS possono anche importare dati e fare cose del genere.

  6. È possibile creare table2_temp, table3_temp, table4_temp (può essere per utente dinamicamente e rilasciarli successivamente). Elaborate separatamente e MERGE nella main table2, table3, table4, se i trigger in table4 non funzionano su dati preesistenti.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow