2016-05-24 3 views
0

Funktionale AnforderungDer beste Weg, Tabellen für große Datenmengen erstellen Oracle mit

Wir irgendwie für Geräte arbeiten. Jedes Gerät hat ungefähr seine eindeutige Kennung, eine IP-Adresse und einen Typ.

Ich habe eine Routine, die alle Geräte pingt, die eine IP-Adresse hat. Diese Routine ist nichts anderes als eine C# -Konsolenanwendung, die alle 3 Minuten versucht, die IP-Adresse jedes Geräts zu pingen. Das Ergebnis des Ping muss ich in der Datenbank speichern, sowie das Datum der Verifizierung (unabhängig vom Ergebnis des Ping).

Dann gingen wir in die technische Seite.

Technischer Teil:

mein ping und Bank Strukturierung Unter der Annahme Prozess ab dem Tag bereit ist, 2016.01.06, muss ich zwei Dinge tun:

  • Tägliche Extraktion
  • Extraction in Echtzeit (letzte 24 Stunden)

Beide sollen die gleiche Sache zurück:

  • Geräte, die länger als 24 Stunden nicht verfügbar sind.
  • Geräte, die länger als 7 Tage nicht verfügbar sind.

Verstanden, um nicht verfügbar zu sein, das Gerät zu pingen und nicht geantwortet. Es wird davon ausgegangen, dass das verfügbare Gerät gepingt UND erfolgreich beantwortet wird.

: Was habe ich heute und arbeitet sehr schlecht:

Eine Tabelle mit der folgenden Struktur:

create table history (id_device number, response number, date date); 

Diese Tabelle hat eine große Menge an Daten (jetzt hat 60 Millionen, aber der Trend ist immer exponentiell

wachsen) ** Hier sind die Fragen: **

  • Wie diese erreichen Ziele ohne Probleme der Langsamkeit in Abfragen?
  • Wie erstellt man eine Tabellenstruktur, die bereit ist, Millionen/Milliarden von Datensätzen in meiner Unternehmenswelt zu empfangen?
+1

Persönlich würde ich 2 Tabellen verwenden. Eine Tabelle mit Partitionierung für das Datum (oder den Monat) zum Speichern historischer Daten. Und eine kleinere Tabelle für die letzten Aufzeichnungen. Und dann verschieben Sie die Daten täglich von der kleineren Tabelle durch ein automatisiertes Skript in die große Tabelle. – LukStorms

Antwort

1

Partitionieren Sie die Tabelle basierend auf dem Datum. Für die Partitionierungsstrategie Leistung und Wartung berücksichtigen. Für einfache Wartung verwenden Sie automatische INTERVAL Partitionen nach Monat oder Woche. Sie können dies sogar am Tag erledigen oder 2-Tage-Intervalle manuell vordefinieren. Die Abfrage dauert nur 2 Kalendertage.

select id_device, 
     min(case when response is null then 'N' else 'Y' end), 
     max(case when response is not null then date end) 
from history 
where date > sysdate - 1 
group by id_device 
having min(case when response is null then 'N' else 'Y' end) = 'N' 
    and sysdate - max(case when response is not null then date end) > ?; 

Wenn für fehlende Antworten Sie einen Standardwert statt NULL schreiben, können Sie es als Index-organisierte Tabelle versuchen zu bauen.

Sie müssen über Oracle-Partitionierung lesen.

Mit dieser Anweisung wird Ihre HISTORY-Tabelle nach Kalendertag partitioniert.

create table history (id_device number, response number, date date) 
    PARTITION BY RANGE (date) 
    INTERVAL(NUMTOYMINTERVAL(1, 'DAY')) 
    (PARTITION p0 VALUES LESS THAN (TO_DATE('5-24-2016', 'DD-MM-YYYY')), 
     PARTITION p1 VALUES LESS THAN (TO_DATE('5-25-2016', 'DD-MM-YYYY')); 

Alle Ihre alten Daten werden in P0 Partition sein. Ab dem 24.05.2016 wird jeden Tag automatisch eine neue Partition erstellt. HISTORY ist jetzt ein einzelnes logisches Objekt, aber physikalisch ist es eine Sammlung identischer Tabellen, die übereinander gestapelt sind. Da die Daten jeder Partition separat gespeichert werden, muss nur eine Partition gescannt werden, wenn eine Abfrage nach Daten für einen Tag fragt.

+0

Danke für die Antwort! Aber was meinst du mit Partitionieren der Tabelle? Sie beabsichtigen, N andere Tabellen basierend auf ihren Monaten zu erstellen? kannst du mir ein beispiel zeigen? –

+0

Gab Ihnen ein Beispiel oben, aber Sie müssen wirklich über Partitionierung lesen –

+0

Muss ich die Tabelle erneut erstellen? Gibt es eine Möglichkeit, die Tabelle in Monate aufzuteilen? –