Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
INSERT wesentlich langsamer als vergleichbarer SSIS Task (SQL Server)
davidG
myCSharp.de - Member



Dabei seit:
Beiträge: 67

Themenstarter:

INSERT wesentlich langsamer als vergleichbarer SSIS Task (SQL Server)

beantworten | zitieren | melden

verwendetes Datenbanksystem: MS SQL Server 2005

Ich habe eine C#-Anwendung mit der ich Daten auf verschiedene Art und Weiße anlysiere. Für eine Analyse verwenden ich den Assoziations-Alogrithmus vom MS Sql Server 2005. Die benötigten Daten selektiere ich davor und lasse sie in eine extra Tabelle eintragen. Dabei handelt es sich um 100000 - 2500000 Einträge.

Meine erste Lösung sah folgendermaßen aus: Die benötigten Daten wurden in eine List<Collection> gespeichert und anschließend via SqlCommand etc. in die DB eingetragen. Der Code sieht wie folgt aus:


       public void InsertTmpData(List<MyCol3<string, int, int>> resultList)
        {
            SqlTransaction sqlTransaction;

            using(SqlConnection sqlCon = new SqlConnection(_connection))
            {
                sqlCon.Open();
                
                sqlTransaction = sqlCon.BeginTransaction();

                try
                {
                    using (SqlCommand sqlCmd = new SqlCommand("INSERT INTO tmpData (word,urlId) VALUES (@word,@urlId)"))
                    {
                        sqlCmd.Connection = sqlCon;
                        sqlCmd.Transaction = sqlTransaction;

                        for (int index = 0; index < resultList.Count; index++)
                        {
                            sqlCmd.Parameters.AddWithValue("@word", resultList[index].ValueA);
                            sqlCmd.Parameters.AddWithValue("@urlId", resultList[index].ValueC);

                            sqlCmd.ExecuteNonQuery();

                            sqlCmd.Parameters.Clear();

                            _tmpIndex = index;
                            OnIndexEvent();
                        }
                    }

                    sqlTransaction.Commit();
                }
                catch(Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message);
                    sqlTransaction.Rollback();
                }
                finally
                {
                    sqlCon.Close();
                }
            }
        }

Diese Variante hat bei ca. 2,3 Mio Einträge ca. 30 - 45 min gedauert. Das hat mir persönlich zu lange gedauert und ich habe nach weiteren Lösungmöglichkeiten gesucht. Gestern hatte ich die Idee, die Daten in ein XML File zu speichern und diese XML File anschließend mit einem SSIS-Datenfluss-Prozess in die Datenbank zu transferieren. Und sieh da, das Ganze dauert nicht einmal 3 Minuten. Der SSIS Task, der die Daten aus der XML-Datei in die Datenbank kopiert, brauchte ca. zwei Minuten.
Jetzt meine Frage, warum braucht mein Code 30 - 45 Minuten und der SSIS Task ca. 2 Minuten? Liegt es daran, dass SSIS viel dichter an der DB ist oder habe ich in meinem Code eine Bremse drinnen?
„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay
private Nachricht | Beiträge des Benutzers
Khalid
myCSharp.de - Experte

Avatar #avatar-2534.gif


Dabei seit:
Beiträge: 3.511
Herkunft: Hannover

beantworten | zitieren | melden

Zitat
Jetzt meine Frage, warum braucht mein Code 30 - 45 Minuten und der SSIS Task ca. 2 Minuten? Liegt es daran, dass SSIS viel dichter an der DB ist oder habe ich in meinem Code eine Bremse drinnen?
Ja hast du. Du machst für jeden Insert der stattfindet ein SqlCommand. SSIS arbeitet mit 100% wahrscheinlichkeit mit BULK INSERT. Das beste ist also, das du ebenfalls per BULK INSERT die Daten in die DB feuerst.

Dazu gibt es in c# die Klasse SqlBulkCopy.
"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)
private Nachricht | Beiträge des Benutzers
davidG
myCSharp.de - Member



Dabei seit:
Beiträge: 67

Themenstarter:

beantworten | zitieren | melden

Danke, werde ich gleich mal ausprobieren.
„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay
private Nachricht | Beiträge des Benutzers
davidG
myCSharp.de - Member



Dabei seit:
Beiträge: 67

Themenstarter:

beantworten | zitieren | melden

Klappt wunderbar: 2,3 Mio Einträge in weniger als eine Minute
„Ich erfand den Begriff «objekt-orientiert», und ich kann sagen, dass ich dabei nicht C++ im Sinn hatte.“ Alan Kay
private Nachricht | Beiträge des Benutzers