2010-04-20 8 views
6

Jetzt haben wir eine Firebird-Datenbank mit 1.000.000, die verarbeitet werden muss, nachdem ALLE im RAM-Speicher geladen wurden. Um all diese Daten zu erhalten, müssen wir Daten für 8 Stunden extrahieren (wählen * zuerst 1000 ...). Was ist die Lösung dafür?Wie 1 Million Datensätze aus der Datenbank schnell geladen werden?

+0

Wie groß ist die Tabelle? Bist du sicher, dass dein Gedächtnis das halten kann? – zsong

+2

Klingt wie ein Job für ... [Die schnellste Datenbank der Welt] (http://thedailywtf.com/Articles/Announcing-APDB-The-Worlds-Fastest-Database.aspx)! –

+0

Eine Million Datensätze sollten in Sekunden geladen werden, es sei denn, dies sind wirklich enorme Datensätze. Wie laden Sie sie? Welche Plattform benutzen Sie? –

Antwort

0

Welche Art von Verarbeitung benötigen Sie, um sie in den Speicher zu laden und nicht nur über SQL-Anweisungen zu verarbeiten?

Es gibt zwei Techniken, die ich je nach dem, was ich versuche, funktionieren.

  1. Angenommen, es gibt eine Art von künstlichem Schlüssel (Identität), arbeiten Sie in Stapeln und erhöhen Sie den letzten verarbeiteten Identitätswert.

  2. BCP die Daten in eine Textdatei, Churn durch die Updates, dann BCP es wieder in, Erinnerung an Constraints und Indizes vor dem IN-Schritt zu deaktivieren.

+0

Wir machen einige Analysen von jeder von db, und wir müssen sie im Speicher geladen haben. Der Flaschenhals ist der Moment, in dem wir Daten von einem Datensatz zu unseren DTO-Objekten übertragen. –

0

einen Blick auf diese: http://www.firebirdfaq.org/faq13/

+0

Nichts, um mir bei diesem Link zu helfen, vielleicht ist dieses Problem in allen Datenbanken aufgetreten. Ich muss die Zeit für "while (read.Read())" optimieren. –

4

Hat jedes Ihrer "select * zuerst 1000" (wie Sie es beschrieben) scanne eine vollständige Tabelle? Sehen Sie sich diese Abfragen an und stellen Sie sicher, dass sie einen Index verwenden.

+0

Nicht die Select-Geschwindigkeit ist das Problem. Die Übertragung von Daten von Select-Recordset zu Speicher, die while (read.Read()) dauert zu lange ... –

1

Daten aus einer Tabelle zumindest mit 1.000.000 Zeilen in C# mit einem Feuervogel db nimmt 8 Stunden

auf einem Pentium 4 3 GHz laden

Jeder ist schon vorausgesetzt, Sie eine SQL-Abfrage ausgeführt wurden um die Datensätze aus der Datenbank zu wählen Etwas wie

Weil das wirklich ein paar Sekunden dauern würde. Nun, ein wenig länger, um es auf einem Bildschirm anzuzeigen, aber das Ausführen der tatsächlichen Auswahl sollte blitzschnell sein.

Aber dieser Verweis auf C# lässt mich denken, dass Sie etwas anderes machen. Vielleicht haben Sie wirklich eine RBAR-Schleife, die eine Million Objekte instanziiert. Ich kann sehen, wie das etwas länger dauern könnte. Aber trotzdem, acht Stunden? Wo geht die Zeit hin?

bearbeiten

Meine Vermutung war richtig, und Sie sind Instanziieren 1000000 Objekte in einer Schleife. Der richtige Rat wäre, einen anderen Weg zu finden, was auch immer du tust, wenn du alle deine Objekte in Erinnerung hast. Ohne mehr über die Details zu wissen, ist es schwierig, Einzelheiten zu nennen. Aber es scheint unwahrscheinlich, dass dies ein UI ist - welcher Benutzer wird eine Million Objekte durchsuchen?

Also eine allgemeine Beobachtung muss ausreichen: Verwendung Bulk-Operationen, Bulk-Aktivität zu implementieren. SQL-Datenbanken zeichnen sich durch Handling-Sets aus. Nutzen Sie die Leistungsfähigkeit von SQL, um Ihre Millionen Zeilen in einem einzigen Satz und nicht als einzelne Zeilen zu verarbeiten.

Wenn Sie diese Antwort nicht hilfreich finden, dann müssen Sie uns mehr Details bezüglich der Wünsche geben, die Sie erreichen möchten.

+0

Unser Prozess wird maximal einmal im Monat im schlimmsten Fall ausgeführt. Und ja, wir laden alle Daten aus der Tabelle in einer großen einzelnen Schleife. Diese Schleife ist unser Engpass. Für einen Moment dachte ich daran, ein paar Klone der DB zu machen und jetzt einige parallele Abfragen auszuführen, um Daten schneller zu laden. –

+2

WEll Sie nie Datensätze in einer Schleife laden, wenn Sie so viele haben. Das ist Datenbank 101. Ich kenne Firebird nicht, aber die meisten Datenbanken unterstützen die Auswahl in der Einfügung wie Tabelle2 einfügen (Feld1, Feld2) Feld1, Feld2 aus Tabelle1 auswählen Das wäre viel schneller als eine Zeile zu einer Zeit – HLGEM

1

Wie lange dauert es, das DTO-Objekt zu erstellen, das Sie bei jedem Lesen der Daten erstellen?

{ int a = read.GetInt32(0); int b = read.GetInt32(1); mylist.Add(new DTO(a,b)); } 

Sie erstellen eine Million dieser Objekte. Wenn es 29 Millisekunden dauert, um ein DTO-Objekt zu erstellen, wird das mehr als 8 Stunden dauern.

Verwandte Themen