Domanda

Sto per iniziare un viaggio scrivendo un'applicazione Windows Form che aprirà un file txt delimitato da pipe e di circa 230 MB. Questa app inserirà quindi questi dati in un database sql server 2005 (ovviamente questo deve avvenire rapidamente). Sto usando c # 3.0 e .net 3.5 per questo progetto.

Non sto chiedendo l'app, solo alcuni consigli comuni qui e potenziali insidie ??consigli. Dal sito che ho raccolto che la copia bulk SQL è un prerequisito, c'è qualcosa a cui dovrei pensare (penso che aprire il file txt con un'app di moduli sarà un grande sforzo; forse suddividerlo in dati BLOB?).

Grazie, e modificherò la domanda per chiarezza se qualcuno ne ha bisogno.

È stato utile?

Soluzione

Devi scrivere un'app Winforms? Potrebbe essere molto più semplice e veloce usare SSIS. Sono disponibili alcune attività integrate, in particolare Attività di inserimento in blocco .

Inoltre, vale la pena controllare Metodi di importazione in blocco di file flat velocizzare il confronto in SQL Server 2005.

Aggiornamento: se non conosci SSIS, controlla alcuni di questi siti per iniziare rapidamente. 1) Nozioni di base sul flusso di controllo SSIS 2) Introduzione a SQL Server Integration Services

Questo è un altro come: su importazione di file Excel in SQL 2005 .

Altri suggerimenti

Questo sarà uno sforzo di streaming.

Se possibile, non utilizzare le transazioni qui. Il costo transazionale sarà semplicemente troppo elevato.

Quindi, quello che farai è leggere il file una riga alla volta e inserirlo in una riga alla volta. Dovresti scaricare inserti non riusciti in un altro file che puoi diagnosticare in seguito e vedere dove sono falliti.

All'inizio vorrei andare avanti e provare un inserimento collettivo di un paio di centinaia di righe solo per vedere che lo streaming funziona correttamente e quindi puoi aprire tutto ciò che desideri.

Potresti provare a utilizzare SqlBulkCopy . Ti consente di estrarre da " qualsiasi fonte di dati " ;.

Proprio come una nota a margine, a volte è più veloce eliminare gli indici della tabella e ricrearli dopo l'operazione di inserimento in blocco.

Potresti prendere in considerazione il passaggio dal ripristino completo a quello registrato in blocco. Ciò contribuirà a mantenere i backup di dimensioni ragionevoli.

Consiglio vivamente SSIS, puoi leggere milioni di record e ripulirli lungo la strada in relativamente poco tempo.

Dovrai dedicare un po 'di tempo per fare i conti con SSIS, ma dovrebbe pagare. Ci sono alcuni altri thread qui su SO che probabilmente saranno utili:

Qual è il modo più veloce per inserire in blocco molti dati in SQL Server (client C #)

Quali sono i materiali di apprendimento consigliati per SSIS?

Puoi anche creare un pacchetto da C #. Ho un programma C # che legge un file master 3GL "quot" da un sistema legacy (analizza un modello a oggetti usando un'API che ho per un progetto correlato), prende un modello di pacchetto e lo modifica per generare un pacchetto per l'ETL.

La dimensione dei dati di cui stai parlando in realtà non è così gigantesca. Non so quali siano i tuoi problemi di efficienza, ma se puoi aspettare alcune ore per inserirli, potresti essere sorpreso da quanto sarebbe facile realizzare una tecnica davvero ingenua di INSERIRE ciascuna riga una alla volta . Il raggruppamento di circa un migliaio di righe alla volta e l'invio a SQL Server può renderlo anche un po 'più veloce.

Solo un suggerimento che potrebbe farti risparmiare un po 'di tempo di programmazione, se non ti serve per essere il più veloce possibile. A seconda della frequenza con cui deve essere eseguita questa importazione, vale la pena risparmiare qualche giorno di programmazione in cambio di aspettare alcune ore mentre è in esecuzione.

Puoi usare SSIS per la lettura & amp; inserisci, ma chiamalo come pacchetto dalla tua app WinForms. Quindi potresti passare cose come sorgente, destinazione, stringhe di connessione ecc. Come parametro / configurazioni.

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

È possibile impostare trasformazioni e gestione degli errori all'interno di SSIS e persino creare ramificazioni logiche basate su parametri di input.

Se il formato di colonna del file corrisponde alla tabella di destinazione in cui i dati devono finire, preferisco usare l'utilità della riga di comando bcp per caricare il file di dati. È incredibilmente veloce e puoi specificare e file di errore per qualsiasi " dispari " record che non possono essere inseriti.

L'app potrebbe dare il via al comando se è necessario memorizzare i parametri della riga di comando (server, database, nome utente / password o connessione attendibile, tabella, file di errori, ecc.)

Mi piace questo metodo meglio dell'esecuzione di un comando BULK INSERT SQL perché non è necessario che il file di dati si trovi su un sistema accessibile dal server di database. Per utilizzare l'inserimento di massa, è necessario specificare il percorso del file di dati da caricare, quindi deve essere un percorso visibile e leggibile dall'utente di sistema sul server di database che esegue il caricamento. Troppa seccatura per me di solito. : -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top