2008-09-03 6 views
17

Ich habe eine Tabelle mit mehr als einer Millon Zeilen. Diese Tabelle wird zum Indexieren von tiff Bildern verwendet. Jedes Bild hat Felder wie date, number usw. Ich habe Benutzer, die diese Bilder in Chargen von 500 indizieren. Ich muss wissen, ob es besser ist, zuerst 500 Zeilen einzufügen und dann 500 Aktualisierungen durchzuführen oder wenn der Benutzer die Indizierung beendet hat Mach die 500 Inserts mit allen Daten. Eine sehr wichtige Sache ist, dass, wenn ich die 500 Einsätze zuerst mache, diese Zeit für mich frei ist, weil ich es die Nacht vorher tun kann.Kosten von Einfügungen vs Update in SQL Server

Die Frage ist also: ist es besser, Inserts oder Inserts und Updates zu tun, und warum? Ich habe einen id Wert für jedes Bild definiert, und ich habe auch andere Indizes auf den Feldern.

Antwort

25

Aktualisierungen im Sql-Server führen zu Geisterzeilen - d. H. Sql kreuzt eine Zeile und setzt eine neue hinein. Die durchgestrichene Zeile wird später gelöscht.

Sowohl Einfügungen als auch Aktualisierungen können Seitenaufteilungen auf diese Weise verursachen, sie fügen beide effektiv Daten hinzu, es ist nur so, dass Updates die alten Daten zuerst markieren.

Oben auf diesem Update müssen zuerst die Zeile nachschlagen, die für viele Daten länger als das Update dauern kann.

Einfügungen werden fast immer schneller, besonders wenn sie entweder in Reihenfolge sind oder wenn die zugrundeliegende Tabelle keinen gruppierten Index hat.

Wenn Sie größere Datenmengen in eine Tabelle einfügen, sehen Sie sich die aktuellen Indizes an - sie können eine Weile dauern, um sie zu ändern und zu erstellen. Das Hinzufügen von Werten in der Mitte eines Indexes ist immer langsamer.

Sie es wie Anhängen an ein Adreßbuch denken kann: Herr Z kann nur zur letzten Seite hinzugefügt werden, während Sie Platz für

Herr M. in der Mitte finden müssen, werden
1

Ich bin kein Datenbank-Typ, aber ich stelle mir vor, die Einsätze in einem Schuss wäre schneller, weil die Updates einen Lookup benötigen, während die Inserts nicht.

+0

Giovanni, wird es auch hängen von anderen Problemen ab, wie der Indizierung (gruppiert oder nicht geclustert) und dem Füllfaktor. Ihre spezifische Situation wird wesentlich dazu beitragen, wie Sie vorgehen. – Galwegian

2

Die Einfügungen zuerst und dann die Aktualisierungen scheinen aus mehreren Gründen eine bessere Idee zu sein. Sie werden zu einem Zeitpunkt mit geringem Transaktionsvolumen eingefügt. Da Einfügungen mehr Daten haben, ist dies ein besserer Zeitpunkt dafür.

Da Sie einen ID-Wert (der vermutlich indiziert ist) für Updates verwenden, ist der Aufwand für Updates sehr gering. Sie hätten während Ihrer Aktualisierungen auch weniger Daten.

Sie können Transaktionen auch auf Stapelebene (500 Einfügevorgänge/Aktualisierungen) inaktivieren und sie für jeden einzelnen Datensatz verwenden, wodurch der Overhead reduziert wird.

Schließlich testen Sie dies, um die tatsächliche Leistung auf Ihrem Server zu sehen, bevor Sie eine endgültige Entscheidung treffen.

1

Der Ausführungsplan für jede Abfrage wird Ihnen sagen, welche sollte teurer sein. Der eigentliche einschränkende Faktor sind die Schreibvorgänge auf der Festplatte. Daher müssen Sie möglicherweise während der Ausführung von perfmon einige Tests ausführen, um zu sehen, welche Abfrage mehr Schreibvorgänge verursacht und die Festplattenwarteschlange am längsten (länger ist schlecht) verursacht.

1

Dies ist keine Schnitt und Trocken Frage. Krishnas und Galegians Punkte sind genau richtig.

Bei Aktualisierungen wird die Auswirkung verringert, wenn sich die Aktualisierungen auf Felder mit fester Länge auswirken. Wenn Sie Varchar- oder Blob-Felder aktualisieren, können Sie während der Aktualisierung Kosten für Seitenaufteilungen hinzufügen, wenn der neue Wert die Länge des alten Werts überschreitet.

1

Ich denke, Einsätze werden schneller laufen. Sie benötigen kein Nachschlagen (wenn Sie ein Update durchführen, machen Sie im Grunde genommen das Äquivalent einer Auswahl mit der WHERE-Klausel). Außerdem wird ein Einfügevorgang die Zeilen nicht so sperren, wie es bei einem Update der Fall ist. Daher werden die Selects, die gleichzeitig mit der Tabelle ausgeführt werden, nicht beeinträchtigt.