Laden...

INSERT wesentlich langsamer als vergleichbarer SSIS Task (SQL Server)

Erstellt von davidG vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.308 Views
D
davidG Themenstarter:in
67 Beiträge seit 2006
vor 15 Jahren
INSERT wesentlich langsamer als vergleichbarer SSIS Task (SQL Server)

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

3.511 Beiträge seit 2005
vor 15 Jahren

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)

D
davidG Themenstarter:in
67 Beiträge seit 2006
vor 15 Jahren

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

D
davidG Themenstarter:in
67 Beiträge seit 2006
vor 15 Jahren

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