2011-01-12 9 views
3

Ich arbeite derzeit an einem Programm, das eine alte Datenbank in einen neueren Stil konvertiert und eine der Aufgaben, die ich zugewiesen wurde, ist, einige alte binäre Spalten zu entfernen und diese in Dokumente in unserem Repository zu konvertieren..NET - Beginnen Sie mit dem Lesen von DataReader, bevor die Abfrage abgeschlossen ist?

Wir haben etwa 1,1 Millionen Zeilen in der Tabelle und mein Prozess dauert etwa 12 Stunden.

Ich bin auf der Suche nach Möglichkeiten, dies alles ein wenig schneller zu machen und eine Sache, die ich betrachte, ist es, die Daten schneller zu bekommen. Wenn es einen Weg gibt, kann ich zu den Ergebnissen meiner Abfrage gelangen, bevor es abgeschlossen ist? Ich habe bemerkt, dass ich, wenn ich eine "select *" - Anweisung für diese Tabelle in Query Analyzer ausführe, Ergebnisse sofort zurückerhalte, aber wenn ich ExecuteReader in .NET verwende, dauert diese Abfrage ungefähr 30 Minuten, bevor ich anfangen kann, die Zeilen zu lesen .

+0

Wie sieht Ihr tatsächlicher Code aus? Es klingt, als ob Sie einige schwere Where-Abfragen für nicht indizierte Spalten haben. Eine einfache SELECT-Operation ohne Filterung sogar von mehreren Millionen Spalten sollte schnell sein, auch mit ExecuteReader. –

+0

Vielleicht können Sie Ihre Anfrage in eine kleinere Anzahl von Zeilen aufteilen und ein paar Threads ausführen, um sie zu verarbeiten? – clyc

+0

@Pauli - Das Problem ist nicht die Indizes so sehr wie die Menge der Daten. Ich habe es mit mehreren BLOB-Spalten zu tun. :( –

Antwort

1

Es kann helfen, command.ExecuteReader(CommandBehavior.SequentialAccess) zu verwenden. Dies erfordert jedoch, dass Sie die Spalten in der richtigen Reihenfolge lesen und Binärwerte auf andere Weise lesen müssen. Ich empfehle reading the documentation on SequentialAccess, damit Sie wissen, welche anderen Änderungen an Ihrem Code möglicherweise vorgenommen werden müssen.

Beachten Sie, dass die gleiche Abfrage sofort im Query Analyzer ausgeführt wird. Das sagt mir, dass die Abfrage in 30 Minuten nicht dauert, um das erste Ergebnis zurückzugeben, oder es in Query Analyzer tun würde. Ich denke, der Umgang mit großen binären Werten ist eine wahrscheinliche Erklärung für diese Diskrepanz. Eine schnelle Möglichkeit zum Testen besteht darin, die Abfrage so zu ändern, dass alles ausgewählt wird, mit Ausnahme der binären Spalten, und festzustellen, ob sich dadurch die Ausführungszeit von ExecuteReader ändert. Wenn die Ausführungszeit ohne binäre Spalten gleich ist, ist es unwahrscheinlich, dass SequentialAccess hilft. Wenn es ohne die binären Spalten schneller ist, kann es sinnvoll sein, SequentialAccess zu verwenden.

+0

Nur um zu verdeutlichen, die vollständige Rückkehr der Abfrage in QA dauert immer noch 30 Minuten, es beginnt nur einen Teil der Daten sofort zurück. Ich bin es geschafft, den Effekt in meinem Code replizieren mit SqlCommand.BeginExecuteReader und ich habe "Ich werde diesen Vorschlag als nächstes ausprobieren und sehen, wie ich die Gesamtzeit erreichen kann." –

+0

Die meisten meiner gesamten Leistungssteigerung kamen von der Verwendung von SqlCommand.BeginExecuteReader, aber das machte auch einen guten Eindruck von 12 Stunden bis 1,5. –

Verwandte Themen