Laden...

Löschen aller Datensätze einer Tabelle dauert viel zu lange

Letzter Beitrag vor 14 Jahren 10 Posts 1.706 Views
Löschen aller Datensätze einer Tabelle dauert viel zu lange

Moin,
Ich habe mich mit einem DataContext per Mapping mit meiner SqlCeDatenbank (sdf) verbunden.
Ich habe mehrere Tabellen und per Optionen sollen alle Datensätze gelöscht werden.
Bei Tabelle2 - Pseudo natürlich;) - braucht er 45 Sekunden (ca. 600.000 Datensätze)
und bei den anderen unter 1 Sekunde, wobei auch Tabellen dabei sind die ca. 300.000 Datensätze beinhaltet.

Welche Gründe kann es geben, das genau diese eine Tabelle sooo lange braucht ??
(Andere Tabellen haben auch mehrere Spalten)

Tabelle2:
GUID (uniqueidentifier) Spalte1
GUID (uniqueidentifier) Spalte2
GUID (uniqueidentifier) Spalte3
DateTime (date) Spalte4
int (int) Spalte5

Lösch-Logik


            List<string> sqlCeCommandStrings = new List<string>(new string[]
                {
                delTabelle1, // DELETE FROM 'Tabellenname'
                delTabelle2,
                delTabelle3,
                delTabelle4,
                delTabelle5,
                delTabelle6,
                delTabelle7,
                delTabelle8,
                delTabelle9
                });

            int errorCount = 0;

            System.Diagnostics.Stopwatch t = new System.Diagnostics.Stopwatch();

            // Befehle ausführen
            foreach (var cmdString in sqlCeCommandStrings)
            {
                SqlCeCommand cmd = new SqlCeCommand(cmdString, base.connection);
                t.Start();
                cmd.ExecuteNonQuery();
                t.Stop();
                t.Reset();
            }

Kann es sein, dass du einen Foreign-key auf einer deiner Spalten hast? Falls ja, einfach einen Index auf die jeweilige Spalte legen - danach sollte die Performance deutlich besser sein.

Zum Löschen aller Datensätze gibt es (im Prinzip, also im SQL-Standard) den TRUNCATE-Befehl. Aber auch dann kann die Existenz von ForeignKeys das Löschen ausbremsen.

Gruß Jürgen

@spacenet (nächster Beitrag)
Das hatte ich befürchtet; vorsichtshalber hatte ich "im Prinzip" geschrieben. 😁

@juetho: afaik gibts truncate beim abgespeckten SqlCe nicht.

Ich habe keine Fremdschlüssel-Beziehungen angegeben,
klar benutzte ich die 2 IDs dafür (GUID) aber das weiß die Datenbank ja nicht.
Es muss ein anderer Grund sein...

Hallo,
wenn du keine FK-Beziehungen hast, dann mach doch einfach ein DROP Table und kreiere die Tabelle danach neu. Außerdem würde ich nicht in einem foreach die Befehle einzeln an die DB schicken, sondern in einem Command, besser noch in einer Transaktion, zusammenfassen.

Auf meinem alten PC hat das Öffnen von connections zum SQLServer immer ewig gedauert, habe nie herausbekommen, warum.
War wohl iwie falsch konfiguriert.
Dass der sql-Löschbefehl selbst so lange dauert, kannichmir nicht vorstellen.

Der frühe Apfel fängt den Wurm.

Ein Delete from dauert in der Tat lange.
Für schnelleres Arbeiten sollte der Truncate-Befehl genutzt werden. Wurde ja auch schon weiter oben erwähnt.

Wobei man dabei wissen sollte, was Truncate wirklich anstellt.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Du hast Recht Khalid. Ist aber eigentlich immer so, oder? 😉

Eine Erklärung gibts z.B. hier