Laden...

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

Erstellt von Gepro vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.639 Views
G
Gepro Themenstarter:in
419 Beiträge seit 2007
vor 13 Jahren
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();
            }

S
16 Beiträge seit 2010
vor 13 Jahren

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.

J
3.331 Beiträge seit 2006
vor 13 Jahren

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. 😁

S
16 Beiträge seit 2010
vor 13 Jahren

@juetho: afaik gibts truncate beim abgespeckten SqlCe nicht.

G
Gepro Themenstarter:in
419 Beiträge seit 2007
vor 13 Jahren

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...

M
17 Beiträge seit 2010
vor 13 Jahren

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.

5.299 Beiträge seit 2008
vor 13 Jahren

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.

J
1.114 Beiträge seit 2007
vor 13 Jahren

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.

3.511 Beiträge seit 2005
vor 13 Jahren

Wobei man dabei wissen sollte, was Truncate wirklich anstellt.

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

J
1.114 Beiträge seit 2007
vor 13 Jahren

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

Eine Erklärung gibts z.B. hier