2

Ich habe Code in C# geschrieben, die Datensätze aus einer Datenbank löscht. Es ist Ihr einfacher SQL-Löschcode, der in einer Transaktion enthalten ist.Löschen von Zeilen aus SQL Server erhöhte die Datenbankgröße

using (SqlTransaction trans = conn.BeginTransaction()) { 
    //some delete code 
    trans.Commit(); 
} 

Ich habe etwa 4 Millionen Zeilen über 4 Tabellen in meiner Datenbank gelöscht. 7GB

  • Nach dem Löschen: Wenn ich die Datenbank-Backup-Größe beiden DBs über den Windows Explorer aktiviert ist, hat die Größe dramatisch

    • Vor dem Löschen etwa dreimal erhöht 28GB

    I bestätigt dass sowohl die MDF als auch die LDF Dateien in der Größe zugenommen haben. Ich habe auch bemerkt, dass einige Tabellen, die nicht von der Löschung betroffen sind, ihre Indexgröße erhöht haben.

    Nach dem Löschen:

    enter image description here

    vor dem Löschen:

    enter image description here

    Mein Ziel ist es Datensätze zu löschen, die Größe der Datenbank zu reduzieren, aber es erhöht statt. Können Sie mir sagen, warum die Größe zunimmt?

    EDIT:

    Nach dem Löschen:

    • database_size: 61.050,69 MB
    • nicht zugeordneten Speicherplatz: 9.592,60 MB
    • reserviert: 303.512 KB
    • Daten: 207.040 KB
    • index_size: 53024 KB
    • ungenutzt: 43448 KB

    vor dem Löschen:

    • database_size: 100 67,88 MB
    • nicht zugeordneter Speicherplatz: 16.69 MB
    • vorbehalten: 7.290.176 KB
    • Daten: 2.937.656 KB
    • index_size: 4.324.848 KB
    • ungenutzt: 27672 KB
  • +0

    Dieses besser geeignet für dba.se ist, da der Grund für diese (und die Antwort) nichts mit C# zu tun hat. Jedes DELETE, das viele Zeilen in einer Transaktion löscht, wird dieses Problem veranschaulichen. –

    +0

    Ich würde erwarten, dass die LDF definitiv zunehmen wird und die MDF zumindest gleich bleibt, aber wahrscheinlich zunimmt. Also gib uns ein paar Zahlen. Und verwenden Sie 'sp_spaceused', um herauszufinden, wie viel Speicherplatz belegt ist und wie viel Speicherplatz reserviert ist. Normalerweise wird ein Löschvorgang Speicherplatz in einer MDF freigeben, die tatsächliche Datei wird jedoch nicht verkleinert (da sie wahrscheinlich nur erneut vergrößert werden muss) –

    +1

    Mögliches Duplikat von [Datenbankgröße größer nach dem Löschen aus der Tabelle] (http: // stackoverflow. com/questions/10865201/Datenbank-Größe-größer-nach-löschen-aus-Tabelle) – pmcilreavy

    Antwort

    2

    , wenn Sie Datensätze löschen dann Protokoll zum Transaktionslog durch das Löschen so vieler Datensätze erhöht sich die Transaktionsprotokollgröße.

    Also ich denke, Sie müssen löschen/zurücksetzen Transaktionsprotokoll (Google it) und zur gleichen Zeit haben Sie reorganisieren Indizes.

    Beide Schritte sind obligatorisch.

    0

    Wenn Indizes für die Tabellen gruppiert sind, wo die Zeilen gelöscht wurden, können entweder die Streichung der Größe der Tabellen lassen und Indizes unverändert oder sogar erhöhen. Häufig basiert der Primärschlüssel für die Tabelle auf einem gruppierten Index.

    In dieser Situation sollten Sie die Indizes mit dem Befehl

    alter index _indexName on _tableName rebuild 
    

    wo _indexName ist der Name des Clustered-Index wieder aufzubauen.

    siehe auch https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-index-transact-sql

    Verwandte Themen