2012-03-27 1 views
1

Wir haben eine Anwendung, die große Anzahl von Änderungen in einer Tabelle (Tabelle 1) in einer SQL Server 2000-Datenbank veröffentlicht.Mass Updates für SQL Server 2008-Datenbank mit. NET-Anwendung - die performanteste Methode

Jedes Insert/Update/Löschen von Bränden einen Trigger auf der Tabelle, und bucht die Details der Änderung in einer anderen Tabelle (Tabelle 2), einschließlich dem eindeutigen Schlüssel der Tabelle 1.

Dann in bestimmten Abständen ein. Die Net-Anwendung fragt Tabelle 2 ab, um festzustellen, ob Aktualisierungen an eine identische Tabelle in Tabelle 1 in einer SQL Server 2008-Datenbank übertragen werden müssen - Tabelle 3. Die Routine nimmt die "Top 10000" -Reihen von Änderungen und wendet sie an einzeln zu Tabelle 3, Wiederholen des Prozesses, bis keine übrig sind. Jeder 10.000 benötigt ungefähr eine Minute, um zu verarbeiten, einschließlich der Massenaktualisierung von Tabelle 2, um die Übertragung von vervollständigten Daten anzuzeigen.

Jede Aktualisierung von Tabelle 3 wird mit dem eindeutigen Schlüssel durchgeführt, und die Indexierung auf der Tabelle ist solide.

Sobald die Aktualisierung in Tabelle 3 abgeschlossen ist, wird Tabelle 2 aktualisiert, um anzuzeigen, dass die Transaktion auf die SQL Server 2008-Datenbank angewendet wurde.

Tabelle 1 wird manchmal mit 40.000 Updates angezeigt, diese scheinen gut zu funktionieren, aber die SQl Server 2008-Datenbank leidet, wenn die Datensätze dort aktualisiert werden.

Was ist der leistungsfähigste Weg, um die Updates in Tabelle 3 zu veröffentlichen?

Ich obwohl Service-Broker kann den Job erledigen, aber wie erstelle ich die XML-Nachricht in der .Net-App und lassen Sie sie in der Warteschlange für Service-Broker zutreffen - und würde es nicht die gleichen Probleme trotzdem verursachen - gleiche Arbeit in einem anderen Prozess.

+0

Haben Sie sich die Replikation angesehen oder sogar einen SQL-Job gemacht? –

+0

Paul, ich wollte diesen Job erst mit T-SQL abschließen, als er auf den Markt kam. Da ich sowohl SQL 2000- als auch SQL 2008-Datenbanken verwendete, fand ich heraus, dass es nichts gab, was die Arbeit akzeptabel machen würde. Ich habe über OpenQuery nachgedacht, aber das schien auch nicht zu funktionieren. Wenn du einen Vorschlag hast, dass du weißt, dass es funktionieren wird - ich bin ganz Ohr! –

+0

Sie haben wahrscheinlich alles versucht, was ich vorschlagen konnte, aber manchmal ist eine SQL-Antwort für Entwickler nicht immer offensichtlich. Wenn es möglich gewesen wäre, hätte ich versucht, die Server zu verbinden und all die schwere Arbeit im SQL 2008-Server zu erledigen, aber ich würde es wahrscheinlich wieder zu sehr vereinfachen. –

Antwort

0

Die Verwendung von Service Broker wird Ihre Arbeit nicht magisch beschleunigen. Warum erwartest du das?

Die effizienteste Möglichkeit, Massen-DML auszuführen, besteht normalerweise darin, sie in größeren Mengen pro Abfrage auszuführen. Auf diese Weise kann der Optimierer den Abfrageplan genau auf die Anzahl der Zeilen abstimmen, die er erhalten soll. Wenn Sie jedes Update als einzelne Abfrage ausführen, kann das Optimierungsprogramm nicht über Abfragen hinweg optimiert werden.

Also ich empfehle Ihnen versuchen, alle Updates in eine einzige Zusammenführungs-Anweisung zu passen. Fügen Sie auch die Einfügungen und Löschungen in dieser einzelnen Zusammenführungsabfrage ein.

+0

usr - Entschuldigung, wenn ich nicht klar war, erwartete ich nicht Service Broker das Problem magisch zu beheben, daher mein Kommentar "... Service Broker zu bewerben - und würde es nicht die gleichen Probleme trotzdem verursachen - gleiche Arbeit durchgeführt durch einen anderen Prozess. " Ich mag Ihren Kommentar zu einer einzigen Zusammenführungsabfrage. Aber "Single Merge Query" ist eine neue Phrase für mich. Meinst du eine Merge-Anweisung (ich habe noch nie eine verwendet) oder etwas anderes? –

+0

Ja, eine Merge-Anweisung. Es kann bis zu drei DML-Unterklauseln enthalten. In Ihrem Fall eins für das Einfügen, eins für das Update und eins für das Löschen. – usr

Verwandte Themen