AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Tabellen für viele kleine Datensätze optimieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tabellen für viele kleine Datensätze optimieren

Ein Thema von Medium · begonnen am 9. Jul 2014 · letzter Beitrag vom 10. Aug 2014
Antwort Antwort
Seite 2 von 7     12 34     Letzte »    
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Tabellen für viele kleine Datensätze optimieren

  Alt 9. Jul 2014, 21:25
Wofür benötigst du denn `id` int(10) unsigned NOT NULL auto_increment, ?

Eigentlich ist die doch für nix gut ...
  • Ein PK würde sich anbieten auf valueID und vdate.
  • Statt InnoDB eher MyISAM nehmen.
  • Partitions auf die Jahre legen (eine monatliche Unterteilung geht auch mit Extract( YEAR_MONTH FROM vdate ) )
SQL-Code:
CREATE TABLE `history` (
  `valueID` smallint(5) unsigned NOT NULL,
  `vdate` datetime NOT NULL,
  `maxValue` float NOT NULL,
  `meanValue` float NOT NULL,
  PRIMARY KEY (`valueID`,`vdate`)
)
PARTITION BY RANGE(YEAR(valueDate))
PARTITIONS 3 (
  PARTITION `p2012` VALUES LESS THAN (2013) ENGINE=MyISAM ,
  PARTITION `p2013` VALUES LESS THAN (2014) ENGINE=MyISAM ,
  PARTITION `pCurrent` VALUES LESS THAN (MAXVALUE) ENGINE=MyISAM )
ENGINE=MyISAM
Um für das nächste Jahr eine neue Partition anzufügen einfach diesen Befehl ausführen
SQL-Code:
ALTER TABLE `values` REORGANIZE PARTITION pCurrent INTO
( PARTITION p2014 VALUES LESS THAN (2015),
   PARTITION pCurrent VALUES LESS THAN MAXVALUE )
Mit den Partitions hat sich dann das Problem mit der Datensicherung auch erledigt, denn nun gibt es pro Partition separate Dateien und wenn nur aktuelle Datensätze angefügt werden, dann bleiben die alten Dateien unberührt und müssen eben nicht mehr gesichert werden.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 9. Jul 2014 um 21:28 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#12

AW: Tabellen für viele kleine Datensätze optimieren

  Alt 10. Jul 2014, 08:05
Wofür benötigst du denn `id` int(10) unsigned NOT NULL auto_increment, ?
Weil es allgemein gesehen besser ist, für einen Datensatz einen eindeutigen anonymen Schlüssel zu haben. Ob es hier besser ist? Wenn man -wie vermutlich hier- die Daten nie ändert, sondern nur anfügt, braucht man das tatsächlich nicht. Da wird dann aber auch überhaupt kein PK benötigt.

Da man nur über vDate und ValueID abfragt, sollte ein Index reichen: ValueID+vDate (das meint Sir Rufo vermutlich mit 'PK über ValueID und vDate'. Hier steht jedoch nicht der Primary Key im Vordergrund, sondern ein nonunique index. Denn: Falls vDate in der Granularität nicht pikosekundengenau ist, wäre es denkbar, zwei Messwerte zum gleichen Zeitpunkt zu haben. Zumindest ausschließen kann man das nicht.

MySQL kennt vermutlich keinen Clustered Index, so wie MS SQL-Server. Gäbe es jedoch ein ähnliches Konzept, wäre ein Clustered Index über vDate+ValueID noch schneller, da bei den Abfragen nur ein Clustered Index-Seek/Scan ausgeführt wird.

Wenn man beim Auswerten über einen Zeitraum auch 'nur Morgens zwischen 8-10' abfragen will, dann Datum und Uhrzeit getrennt, sonst als Timestamp.

Grundsätzlich würde ich trotzdem das Konzept mit den redundanten Aggregationstabellen verfolgen, es macht einfach Spaß, in Echtzeit in die Daten zu zoomen und zu scrollen, ohne irgendwelche Last zu produzieren. Man sollte ja auch bedenken, das man entweder eine separate Auswerte-DB erstellt, oder -wenn man das nicht macht- den Server mit Auswertungen nicht zu sehr belastet. Das wäre dann ziemlich blöd, wenn er gerade wie ein blöder Daten fressen soll, aber nicht kann, weil eine Tabelle wegen einer Auswertung gelocked ist.

Zitat:
Mit den Partitions hat sich dann das Problem mit der Datensicherung auch erledigt,...
Top.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#13

AW: Tabellen für viele kleine Datensätze optimieren

  Alt 10. Jul 2014, 11:48
Södale, ihr habt mich ganz gut davon überzeugen können, dass eine Spaltung in mehrere Tabellen nicht das Gelbe vom Ei ist. Den aktuellen PK, also das autoinc Feld, kann ich hier tatsächlich weg lassen. Hab mir das angewöhnt, weil ich es für unsere Hauptanwendung zwingend brauche, das hier ist aber ausser der Reihe. Der fliegt also schon mal.

Partitioning klingt sehr praktisch, danke auch für das Beispiel als Code. Gelesen habe ich ein wenig drüber, genutzt bisher nicht. Das einzige was mich an der gezeigten Variante stört ist, dass ich quasi jedes Jahr ein "Pflege-Statement" ausführen muss, was mit Sicherheit spätestens nach dem 2. Jahr im Tagesgeschäft unter geht. Kann man es so deichseln, dass mit Beginn eines neuen Jahres automatisch eine neue Partition begonnen wird?

Bezüglich Index: Hier fehlt mir auch noch ein wenig Erfahrung um genau sagen zu können, welche Indizes ich hier wirklich brauche. Einen PK braucht es glaube ich wirklich nicht, aber wenn, dass wäre vdate+valueID ein guter Kandidat. Die kürzesten Intervalle von Einträgen mit derselben valueID sind 1 Minute, also garantiert verschiedene Timestamps.
Bisher habe ich recht naiv immer über die einzelnen Felder einen Index angelegt, die ich nachher in meinen WHERE-Klauseln benutze. Das wäre in diesem Fall vdate und valueID, auch in Kombination. Es wird nachher sicherlich ein Statement der folgenden Struktur genutzt um die Daten zu holen:
SQL-Code:
SELECT
  h.vdate, h.valueID, h.maxValue, h.meanValue, v.valueName
FROM
  history h JOIN valueList v
    ON h.valueID = v.id
WHERE
  (h.vdate BETWEEN :sDate AND :eDate) AND
  (v.valueID IN ({idListe}))
Edit: Der Join macht eigentlich kaum Sinn, da ohnehin bei der Ausgabe nach valueID, vdate sortiert werden sollte. Die Messstellennamen kann ich mir also auch billiger in einem separaten Statement holen und als Überschrift/Legende einsetzen. Die müssen nicht bei jedem Datensatz einzeln bei stehen.

Ist es da besser einen kombinierten Index auf vdate und valueID zu legen, oder jedes Feld seinen eigenen? Oder gar beides? Welche Art von Index eigenet sich hier? (Beide Felder sind für sich genommen non-unique, in Kombi aber unique.) Mein MySQL Tabellen-Tool bietet mir hier die Optionen:
Index Kind: Index, Primary, Unique, Fulltext, Spatial
Index Type: Default, BTree, Hash, RTree
Ich habe mich bisher schämlich wenig damit befasst, welche Index-Arten für welche Fälle geeignet sind

Die angesprochene Trennung von Datum und Uhrzeit wird nicht nötig sein. Wenn, dann werden immer komplette Zeiträume am Stück abgefragt.

Eine separate Tabelle mit Daten zur Anzeige, und Umschaltung bei Zoom klingt zunächst sehr nett, aber ich weiss nicht, ob ich es mir leisten kann auf Dauer mehrere Granularitäten vollständig vorzuhalten. Klar ist, dass ich bei einem Zoom, der pro Pixel im Graphen z.B. 30min entspricht nicht alle minütlichen Werte übers Netzwerk jagen lassen wollen würde. Das Problem habe ich mir bisher nicht genauer angesehen, und hatte gehofft eine Möglichkeit zu finden vielleicht angeben zu können, dass ich nur jeden 2. oder 3. Datensatz einer Ergebnismenge vom Server bekomme. Gibt es sowas?
Wenn nicht, werden redundante Tabellen leider doch wieder interesant, weil vermutlich die letzte Möglichkeit dann.

Danke zwischendurch schon mal für die rege und produktive Teilnahme!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium (10. Jul 2014 um 12:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Tabellen für viele kleine Datensätze optimieren

  Alt 10. Jul 2014, 12:21
Du kannst beim MySQL Events definieren, die zu einem bestimmten Zeitpunkt laufen, also erstellst du dir einen Event, der einmal im Jahr losläuft und die entsprechende Partition neu erstellt.

Hier auch ein entsprechender SO-Beitrag

Der Pflegeaufwand geht also auch gegen Null
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#15

AW: Tabellen für viele kleine Datensätze optimieren

  Alt 10. Jul 2014, 13:33
Ist es da besser einen
Es wird nur ein Index verwendet, ergo dürfte der kombinierte Index der richtige sein. In welcher Reihenfolge? ich würde ValueID+vDate nehmen, wenn Du nur von wenigen der 650 Stationen Werte über einen Zeitraum haben möchtest. Aber *wetten* würde ich nicht.
Zitat:
... Gibt es sowas? Wenn nicht, werden redundante Tabellen leider doch wieder interesant, weil vermutlich die letzte Möglichkeit dann.
Wieso eigentlich 'leider'? Das ist mit ein paar Triggern oder cron-Jobs gemacht (also alle paar minuten die Daten der letzten paar Minuten aggregieren und in die Reporttabellen schubsen)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Tabellen für viele kleine Datensätze optimieren

  Alt 10. Jul 2014, 14:06
Bei den Datenmengen würde ich mit dem automatischen Partitioning vorsichtig sein. Es wird wohl in der Regel problemlos funktionieren, aber ich würde das lieber auf Termin legen und unter eigener Aufsicht laufen lassen. Ist aber Geschmackssache.

Was für dich auch interessant sein könnte, sind Indexed Views. Dort hast du dann automatisch deine aggregierten Werte und brauchst keine Trigger oder Events. Es gibt aber wohl ein paar Einschränkungen, soweit ich das auf die schnelle gelesen habe. Ich kenne das unter Oracle unter dem Begriff "Materialized Views" und habe damit gute Erfahrungen gemacht. Allerdings habe ich die nicht automatisch aktualisieren lassen, da ich entsprechende Auswertungen nur monatsweise benötigt habe. Da bot sich ein Refresh einmal im Monat an.
Peter
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#17

AW: Tabellen für viele kleine Datensätze optimieren

  Alt 10. Jul 2014, 14:48
... sind Indexed Views. Dort hast du dann automatisch deine aggregierten Werte und brauchst keine Trigger oder Events. Es gibt aber wohl ein paar Einschränkungen, ...
Achtung! mySQL... nicht SQL-Server
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#18

AW: Tabellen für viele kleine Datensätze optimieren

  Alt 10. Jul 2014, 15:07
Achtung! mySQL... nicht SQL-Server
Ups. Sorry.
Peter
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#19

AW: Tabellen für viele kleine Datensätze optimieren

  Alt 10. Jul 2014, 15:35
Da ich bisher nur gute Erfahrungen mit views gemacht habe, würde ich diese auch bevorzugen (oracle).
Jedesmal wenn ich irgendwelche kumulierten Daten in die Finger bekomme, gibt es ein paar Abweichungen, weil immer der eine oder andere Job nicht gelaufen ist oder einen Fehler hatte oder...
(Es kommt immer auf die Daten - die gespeicherten und die gefragten - an)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#20

AW: Tabellen für viele kleine Datensätze optimieren

  Alt 10. Jul 2014, 15:57
Aber bei vielen Daten ist ein View doch auch nicht so gut, wenn er erst stundenlang rumrechnen würde, bei jeder Abfrage.

Drum auch der Vorschlag mit dem Data-Warehouse.
Die Dinger sind erstmal für viele Daten ausgelegt und sie bieten auch sowas wie Views, nur daß Diese job-/zeitgesteuert die Daten der Ansichten vorberechnen, was dann die Abfragen schneller macht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 7     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz