Qual è il modo più veloce per esportare una tabella in un file di testo


17

Avrò un database SQL Server 2012 e una tabella con 3 milioni di righe e forse 50 colonne. Quale sarà il modo più veloce per un processo .net in background non presidiato (forse emette un comando SQL o Powershell) per esportarlo in un file di testo, una riga per ogni riga di dati? Il processo .net dovrebbe sapere quando l'esportazione è terminata o se si sono verificati errori. Il tipo di dati sarà tutto into nvarchar.

Suppongo che un codice C # puro che utilizza ado.net per eseguire un select *comando e scorrere in loop sul datareader e scrivere su un file per ogni record sia lento e non c'è modo di parallelizzare questo.

Idealmente, l'esportazione avverrà in una cartella di rete condivisa remota e non in una cartella locale sul computer SQL Server. SQL Server sarà un cluster HA. SSIS è più adatto a questo, non è richiesta la trasformazione dei dati?

Il processo .Net verrebbe eseguito sulla macchina A, SQL Server sulla macchina B e la destinazione finale del file è una condivisione di rete. Un'opzione è che il server SQL scrive il file direttamente nella condivisione di rete. L'altra opzione è che SQL Server scrive sulla macchina A e quindi quando il file viene scritto il processo .net lo copia nella condivisione di rete. Non ho uno SLA formale ma mi aspetto 30 minuti - 1 ora per la scrittura del file.


3
"Ideally the export will be to a remote shared network folder and not a local folder on the SQL Server machine."- da dove verrà eseguita l'app .NET? Nel peggiore dei casi, ciò potrebbe significare che i dati devono passare attraverso 2 hop di rete, che sarà probabilmente il maggiore collo di bottiglia. Inoltre, il numero di righe è in qualche modo irrilevante: qual è la dimensione totale approssimativa dei dati? Hai uno SLA delle prestazioni che devi rispettare per questo processo?
Jon Seigel,

Risposte:


10

Ripercorrere tutti questi articoli è un'opzione se vuoi invecchiare guardandolo eseguire.

Alcune diverse opzioni che dovresti provare sono:

E puoi provare tutte queste opzioni mentre esegui il loop in un'altra sessione, solo per divertimento :-).


4

Vorrei semplicemente usare l'Importazione / Esportazione guidata. Alla fine ti viene data la possibilità di salvare l'attività, che puoi quindi pianificare con SQL Server Agent. Aggiungiti come operatore e configura DB Mail sul server e può inviarti un'email quando il lavoro viene completato o fallito.

Scherzi a parte, perché reinventare la ruota?

http://msdn.microsoft.com/en-us/library/ms140052.aspx


Non è affatto male, in realtà questo salva un pacchetto SSIS alla fine. Se è una sola volta, può essere una soluzione.
Marian,

2

Altri hanno affermato che bcp dovrebbe essere il modo più veloce ma non vedo alcun vantaggio rispetto a una soluzione CLR. Sugli inserti nelle tabelle del database, vinceranno sempre le varie implementazioni di copia bulk. Ciò è dovuto principalmente al modo in cui minimizzano la registrazione e consentono scritture multi-thread. Non hai questi vincoli quando scrivi su un file flat.

Nel mio lavoro, utilizziamo un CLR per scaricare l'output della query in un file. Incorporiamo anche Ionic.Zip.dll in modo che il file possa essere compresso automaticamente dopo la creazione.

Ecco un esempio che l'operazione afferma di essere due volte più veloce di bcp sui BLOB: /programming/10325338/fastest-way-to-export-blobs-from-table-into-individual-files


Quella domanda particolare non è molto dettagliata. Ti suggerirei di leggere la seguente domanda: Ottimizzare le prestazioni BCP per i dati BLOB qui. Ti darà sicuramente un'idea delle molte opzioni di gioco che hai solo con BCP :-).
Marian,

Vedo i link e sono pienamente d'accordo. Ma la maggior parte dei punti di ottimizzazione riguarda il caricamento dei dati nel server sql. Devo ancora vedere tutti i fatti relativi a bcp più veloci di una soluzione CLR di streamwriter o filestream quando si scrivono dati sql in un file flat.
Brian

1

Puoi creare un semplice pacchetto SSIS:

Ecco un alto livello su come:

  1. Creare una connessione OLEDB al database nella gestione connessione
  2. Trascina una trasformazione del flusso di dati nel flusso di controllo, quindi fai clic su di essa per accedere al flusso di dati.
  3. Trascina un'origine OLEDB dalla casella degli strumenti nel flusso di dati e modificala in modo che si connetta alla tabella desiderata utilizzando la connessione creata nel passaggio 1
  4. Trascina una destinazione file flat dalla casella degli strumenti nel flusso di dati e collega l'origine OLEDB ad esso.
  5. Seleziona "Nuovo" nella destinazione del file flat e creerà un nuovo file flat con la stessa struttura di colonne e puoi utilizzare il delimitatore desiderato, o magari un file fisso se ti piace.
  6. Eseguirlo.

Qualsiasi noob dovrebbe essere in grado di capirlo. Una persona anti-GUI non vorrebbe questa soluzione, quindi salva i commenti a tale proposito, è solo un'alternativa per le persone meno esperte di tecnologia che lottano con BCP ...

Hai un po 'più di flessibilità nella formattazione del file di dati. Puoi farlo in BCP e tutto il resto, ma questo ne toglie la complessità. Ma c'è un piccolo vantaggio in quanto puoi inserire un'intestazione di file personalizzata e creare un "Nome colonna" come prima riga, il che rende il file flat più consumabile dall'uomo.

Non dimenticare di salvarlo, se lo hai creato una volta, probabilmente ti verrà chiesto di nuovo! Spero che sia di aiuto..


0

Penso che bcp.exe dalla riga di comando dovrebbe essere il modo più veloce.

http://msdn.microsoft.com/en-us/library/ms162802.aspx


5
Mentre potresti avere ragione, potresti far luce sui dettagli di questa soluzione? Come viene utilizzato (un collegamento ai documenti potrebbe essere sufficiente), perché pensi che sia il più veloce, ecc.
dezso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.