Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Multithreaded SQL insertion to tables

Îåêßíçóå áðü ôï ìÝëïò Q-apprentice. Τελευταία δημοσίευση από το μέλος AlKiS στις 06-06-2017, 13:24. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  22-04-2017, 10:56 78063

    Multithreaded SQL insertion to tables

    Καλημέρα σας κύριοι !

     Αντιμετωπίζω το εξής θέμα και χρειάζομαι τη βοήθεια/γνώση σας. Έχω δημιουργήσει μια εφαρμογή η οποία αφορά αποθήκη ανταλλακτικών. Χρειάζομαι λοιπόν, να κάνω import κάποια αρχεία csv τα οποία όμως ειναι και πολλά και μεγάλα σε μέγεθος. (περίπου 250 αρχεία μεγέθους από 40-130 mb έκαστο). Όπως καταλαβαίνετε με ενδιαφέρει να το κάνω όσο το δυνατό πιο γρήγορα. Σκέφτηκα λοιπόν να το κάνω multithreaded. να διαβάζω δηλαδή τόσα αρχεία ταυτόχρονα, όσα και τα threads που έχει ο εκάστοτε υπολογιστής. Στο τέλος όλα αυτά θα πάνε σε μια βάση MSSQL Server 2008 R2. Η εφαρμογή είναι γραμμένη σε C# με .ΝΕΤ 4.5. Τέλος να αναφέρω ότι ένας πίνακας αποτελείται απο πολλά CSV αρχεία καθότι είναι πάρα πολλές οι εγγραφές που έχει. Τα αρχεια είναι enumerated (π.χ. Table1_1.csv, Table1_2.csv, Table2_1.csv κτλ)

    Ποια είναι μια σωστή προσέγγιση στο παραπάνω πρόβλημα ;

    Ευχαριστώ εκ των προτέρων 


    Αντώνης Ε. Κόλλιας
    Δημοσίευση στην κατηγορία:
  •  24-04-2017, 12:40 78068 σε απάντηση της 78063

    Απ: Multithreaded SQL insertion to tables

    Καλημέρα σου,

    Αν όπως περιγράφεις έχεις χιλιάδες εγγραφές και προσπαθείς μία-μία να τις περάσεις στην βάση, δεν έχει σημασία αν θα το κάνεις με multi-thread ή όχι αφού θα το κάνει ο SQL Server για σένα αυτό, θα καταλήξεις να θέλεις πολλές ώρες. Αυτό θα γίνει, όχι γιατί ο SQL Server είναι αργός, αλλά γιατί για κάθε εγγραφή θα κάνει ολόκληρο τον κύκλο του transaction, που είναι μια χρονοβόρα διαδικασία.

    Αυτό που θες πραγματικά ήταν να έφτιαχνες μια διαδικασία, που να έπαιρνε ένα αρχείο σαν είσοδο και με ένα transaction να έβαζε όλες τις εγγραφές στην βάση. Μια τέτοια διαδικασία είναι το BULK COPY που ο SQL Server το υποστηρίζει. Θα μπορούσες να δεις το σχετικό documentation (https://docs.microsoft.com/en-us/sql/relational-databases/import-export/bulk-import-and-export-of-data-sql-server) και την σχετική κλάση που έχει το .NET Framework SqlBulkCopy() (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx)

     

    George J. 


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  06-06-2017, 13:24 78109 σε απάντηση της 78063

    Απ: Multithreaded SQL insertion to tables

    Συμφωνώ απολύτως με τον @George J. Capnias 

    Είχα ακριβώς το ίδιο πρόβλημα. Όσων αφορά στη μεταφορά των διαβασμένων αρχείων από το datatable στον SQL Server, το bulkCopy είναι μονόδρομος.

    Η χρήση του είναι ως εξής:

    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(SQLConn)) {
    	bulkCopy.DestinationTableName = KinoDrawsTableName;
    	bulkCopy.WriteToServer(item);
    }

    Όπου SQLConn είναι ένα ανοιχτό SQLConnection με τον SQL Server,

    TableNameOnSQLServer είναι ένα string με το όνομα του τραπεζιού που θέλεις να περαστεί το datatable στον SQL Server,

    και MyDatatable είναι το datatable που έχουν περαστεί οι εγγραφές από τα csv αρχεία 


Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems