Archiv-Tabellen

Archiv-Tabellen

am 23.12.2005 03:56:24 von Oliver Benning

Hallo,

ich habe eine Tabelle, die wirklich große Mengen an Daten enthält und
die ich entlasten will. Nach einem bestimmten Zeitraum möchte ich die
Daten in eine neue Tabelle auslagern, die z.B. den Namen und das
Auslagerungsdatum trägt. Die alten Daten sollen weiterhin für
Statistiken zur Verfügung stehen.

Datensätze, die mittels JOIN mit den auszulagernden Daten verknüpft
sind, müssen dann natürlich den neuen Tabellennamen kennen. Gibt es eine
Möglichkeit, den Tabellennamen aus einer Spalte zu selektieren und im
gleichen Select als JOIN einzusetzen?

Oder gibt es einen anderen, besseren Ansatz für die Archivierung?

Gruß,
Oliver

Re: Archiv-Tabellen

am 23.12.2005 10:35:41 von Dirk Brosowski

Oliver Benning schrieb:
> Hallo,
>
> ich habe eine Tabelle, die wirklich große Mengen an Daten enthält und
> die ich entlasten will. Nach einem bestimmten Zeitraum möchte ich die
> Daten in eine neue Tabelle auslagern, die z.B. den Namen und das
> Auslagerungsdatum trägt. Die alten Daten sollen weiterhin für
> Statistiken zur Verfügung stehen.
>
> Datensätze, die mittels JOIN mit den auszulagernden Daten verknüpft
> sind, müssen dann natürlich den neuen Tabellennamen kennen. Gibt es eine
> Möglichkeit, den Tabellennamen aus einer Spalte zu selektieren und im
> gleichen Select als JOIN einzusetzen?
>
> Oder gibt es einen anderen, besseren Ansatz für die Archivierung?

Was genau hast du davon? Was versprichst du dir von der Entlastung, wenn
du doch auf die Daten gar nicht verzichten kannst? Aus meiner Sicht
erreichst du damit in erster Linie ein schlechtes Design, schlechte
Indizes und eine schlechtere Performance.

Dazu bitte dann die Versions-Nr deiner Datenbank (in anderen Postings
bist du bei einer 3.x) und die Anzahl der Datensätze, Wachstum pro Monat
und Größe eines Datensatzes.

Grüße

Dirk

Re: Archiv-Tabellen

am 23.12.2005 11:17:03 von Axel Schwenke

"Oliver Benning" wrote:

....
> Daten in eine neue Tabelle auslagern, die z.B. den Namen und das
> Auslagerungsdatum trägt.
>
> Datensätze, die mittels JOIN mit den auszulagernden Daten verknüpft
> sind, müssen dann natürlich den neuen Tabellennamen kennen.

Pfft. Jede Idee, die irgendwie generierte Namen für Tabellen oder
Spalten verwendet, ist IMHO höchst blödsinnig.

> Oder gibt es einen anderen, besseren Ansatz für die Archivierung?

Ja. MERGE Tables.


XL

Re: Archiv-Tabellen

am 23.12.2005 11:48:09 von Dominik Echterbruch

Oliver Benning wrote:
> Hallo,
>
> ich habe eine Tabelle, die wirklich große Mengen an Daten enthält und
> die ich entlasten will. Nach einem bestimmten Zeitraum möchte ich die
> Daten in eine neue Tabelle auslagern, die z.B. den Namen und das
> Auslagerungsdatum trägt. Die alten Daten sollen weiterhin für
> Statistiken zur Verfügung stehen.
>
> Datensätze, die mittels JOIN mit den auszulagernden Daten verknüpft
> sind, müssen dann natürlich den neuen Tabellennamen kennen. Gibt es eine
> Möglichkeit, den Tabellennamen aus einer Spalte zu selektieren und im
> gleichen Select als JOIN einzusetzen?
>
> Oder gibt es einen anderen, besseren Ansatz für die Archivierung?

Prinzipiell gilt: Ein Archiv unterliegt (meist) anderen Regeln, als
Live-Daten. Manchmal muß es nicht die gleiche Performance aufweisen,
manchmal müssen die Daten nicht so detailliert sein und manchmal werden
für Statistiken andere Indizes benötigt.
Das heißt, du hast die Möglichkeit, völlig neu zu überlegen, wie du
deine Tabelle definieren möchtest. Und das solltest du auch tun. Du
kannst vielleicht die eine oder andere Spalte weglassen, bestimmte Werte
aufsummieren usw. Dann legst du einen Index auf die Spalten, die deine
Auswertungen beschleunigen.

Aber trotzdem: Alle Daten, die früher in einer Tabelle waren, sollten
auch im Archiv in einer Tabelle liegen. Im Zweifelsfall eher mehrere
Live-Tabellen in eine kumulierte packen, als anders rum.


Grüße,
Dominik
--
MonstersGame - Die Schlacht zwischen Vampiren und Werwölfen
http://spielwelt6.monstersgame.net/?ac=vid&vid=3018786

Re: Archiv-Tabellen

am 23.12.2005 12:20:17 von Oliver Benning

Dirk Brosowski wrote:
> Oliver Benning schrieb:
>> ich habe eine Tabelle, die wirklich große Mengen an Daten enthält und
>> die ich entlasten will. Nach einem bestimmten Zeitraum möchte ich die
>> Daten in eine neue Tabelle auslagern, die z.B. den Namen und das
>> Auslagerungsdatum trägt. Die alten Daten sollen weiterhin für
>> Statistiken zur Verfügung stehen.
>>
>> Datensätze, die mittels JOIN mit den auszulagernden Daten verknüpft
>> sind, müssen dann natürlich den neuen Tabellennamen kennen. Gibt es
>> eine Möglichkeit, den Tabellennamen aus einer Spalte zu selektieren
>> und im gleichen Select als JOIN einzusetzen?
>>
>> Oder gibt es einen anderen, besseren Ansatz für die Archivierung?
>
> Was genau hast du davon? Was versprichst du dir von der Entlastung,
> wenn du doch auf die Daten gar nicht verzichten kannst? Aus meiner
> Sicht erreichst du damit in erster Linie ein schlechtes Design,
> schlechte Indizes und eine schlechtere Performance.
>
> Dazu bitte dann die Versions-Nr deiner Datenbank (in anderen Postings
> bist du bei einer 3.x) und die Anzahl der Datensätze, Wachstum pro
> Monat und Größe eines Datensatzes.

Die alten Daten werden nur noch gelegentlich verwendet, z.B. für
Statistiken, aber auch, um sie bei Bedarf wie die aktuellen Daten
verwenden zu können.

Pro Monat fallen schon mehrere 100 MB an Daten an und das Wachstum liegt
bei 30%. Ein Datensatz hat etwa 4 KB.

Datenbank ist 3.23 und ich schätze mal, daß die Performance sinkt, wenn
die Tabelle irgendwann mehrere GB erreicht hat.

Re: Archiv-Tabellen

am 23.12.2005 12:22:08 von Oliver Benning

Axel Schwenke wrote:
> "Oliver Benning" wrote:
>
> ...
>> Daten in eine neue Tabelle auslagern, die z.B. den Namen und das
>> Auslagerungsdatum trägt.
>>
>> Datensätze, die mittels JOIN mit den auszulagernden Daten verknüpft
>> sind, müssen dann natürlich den neuen Tabellennamen kennen.
>
> Pfft. Jede Idee, die irgendwie generierte Namen für Tabellen oder
> Spalten verwendet, ist IMHO höchst blödsinnig.

Hast Du einen besseren Vorschlag, wenn man z.B. an Dateisystemgrenzen
stösst, die Daten aber noch benötigt?

Re: Archiv-Tabellen

am 23.12.2005 12:55:46 von Nico Haase

Heidiho,
*Oliver Benning* schrub:
>> Pfft. Jede Idee, die irgendwie generierte Namen für Tabellen oder
>> Spalten verwendet, ist IMHO höchst blödsinnig.
>
> Hast Du einen besseren Vorschlag, wenn man z.B. an Dateisystemgrenzen
> stösst, die Daten aber noch benötigt?

Nenn doch mal wirklich Größen für die Tabellen. "Mehrere hundert MB"
pro Monat sollten wirklich noch kein Problem sein, zumindest im Blick
auf die Performance nicht, wenn die Tabelle gut gestaltet ist.
mfg
Nico

--
www.buchtips.net - Rezensionen online

Re: Archiv-Tabellen

am 23.12.2005 13:13:22 von Dirk Brosowski

Oliver Benning schrieb:
> Dirk Brosowski wrote:
>
>> Oliver Benning schrieb:
>>
>>> ich habe eine Tabelle, die wirklich große Mengen an Daten enthält und
>>> die ich entlasten will. Nach einem bestimmten Zeitraum möchte ich die
>>> Daten in eine neue Tabelle auslagern, die z.B. den Namen und das
>>> Auslagerungsdatum trägt. Die alten Daten sollen weiterhin für
>>> Statistiken zur Verfügung stehen.
>>>
>>> Datensätze, die mittels JOIN mit den auszulagernden Daten verknüpft
>>> sind, müssen dann natürlich den neuen Tabellennamen kennen. Gibt es
>>> eine Möglichkeit, den Tabellennamen aus einer Spalte zu selektieren
>>> und im gleichen Select als JOIN einzusetzen?
>>>
>>> Oder gibt es einen anderen, besseren Ansatz für die Archivierung?
>>
>>
>> Was genau hast du davon? Was versprichst du dir von der Entlastung,
>> wenn du doch auf die Daten gar nicht verzichten kannst? Aus meiner
>> Sicht erreichst du damit in erster Linie ein schlechtes Design,
>> schlechte Indizes und eine schlechtere Performance.
>>
>> Dazu bitte dann die Versions-Nr deiner Datenbank (in anderen Postings
>> bist du bei einer 3.x) und die Anzahl der Datensätze, Wachstum pro
>> Monat und Größe eines Datensatzes.
>
>
> Die alten Daten werden nur noch gelegentlich verwendet, z.B. für
> Statistiken, aber auch, um sie bei Bedarf wie die aktuellen Daten
> verwenden zu können.
>
> Pro Monat fallen schon mehrere 100 MB an Daten an und das Wachstum liegt
> bei 30%. Ein Datensatz hat etwa 4 KB.
>
> Datenbank ist 3.23 und ich schätze mal, daß die Performance sinkt, wenn
> die Tabelle irgendwann mehrere GB erreicht hat.

Bei vernünftigen Indizes sinkt die Performance nur unmerklich. Ich habe
ein auslagern auch schon erfolgreich gemacht, aber die Bedingung "wie
die aktuellen Daten verwenden zu können" gab es nicht. Diese Bedingung
ist für mich auch entscheidend. Wenn du die Auslagerung machst, dann in
eine Archivtabelle (statischer Name, wozu dort noch mehrere Tabellen?)
und dann in der Applikation auf getrennte Tabellen reagieren, evtl. mit
einem Union im SQL-Statement.

Wenn dein Dateisystem es mitmacht sind auch 20 GB kein echtes Problem,
wirklich grosse Mengen an Daten sehen anders aus.

Sollte dein Dateisystem aber Probleme machen, dann solltest du um die
Verantwortung für das Projekt tragen zu können an einer Aufrüstung /
Umrüstung des Systems wirken. Auch MySQL 3.23 wird immer wieder ein
Fallstrick sein.

Grüße

Dirk

Re: Archiv-Tabellen

am 23.12.2005 13:31:56 von Axel Schwenke

"Oliver Benning" wrote:
> Axel Schwenke wrote:
>>
>> Pfft. Jede Idee, die irgendwie generierte Namen für Tabellen oder
>> Spalten verwendet, ist IMHO höchst blödsinnig.
>
> Hast Du einen besseren Vorschlag, wenn man z.B. an Dateisystemgrenzen
> stösst, die Daten aber noch benötigt?

MERGE TABLES

__ __ _____ ____ ____ _____ _____ _ ____ _ _____ ____
| \/ | ____| _ \ / ___| ____| |_ _|/ \ | __ )| | | ____/ ___|
| |\/| | _| | |_) | | _| _| | | / _ \ | _ \| | | _| \___ \
| | | | |___| _ <| |_| | |___ | |/ ___ \| |_) | |___| |___ ___) |
|_| |_|_____|_| \_\\____|_____| |_/_/ \_\____/|_____|_____|____/


Wie laut muß ich denn noch schreien?


Außerdem sind selbst mit 3.23.x Tabellen mit mehreren Gigabyte kein
Problem. Nimmst du halt RAID-Tabellen oder gleich InnoDB. BTDT.

Und - ich habe nichts gegen eine (oder mehrere) Archivtabellen gesagt -
nur daß es eine dumme Idee ist, dafür dynamisch generierte Namen zu
verwenden.


XL

Re: Archiv-Tabellen

am 24.12.2005 00:37:20 von Sven Paulus

Oliver Benning wrote:
>> Pfft. Jede Idee, die irgendwie generierte Namen für Tabellen oder
>> Spalten verwendet, ist IMHO höchst blödsinnig.
> Hast Du einen besseren Vorschlag, wenn man z.B. an Dateisystemgrenzen=20
> stösst, die Daten aber noch benötigt?

MySQL 5.1 und Partitioning.

Re: Archiv-Tabellen

am 24.12.2005 01:52:09 von Dirk Brosowski

Sven Paulus schrieb:
> Oliver Benning wrote:
>
>>>Pfft. Jede Idee, die irgendwie generierte Namen für Tabellen oder
>>>Spalten verwendet, ist IMHO höchst blödsinnig.
>>
>>Hast Du einen besseren Vorschlag, wenn man z.B. an Dateisystemgrenzen
>>stösst, die Daten aber noch benötigt?
>
>
> MySQL 5.1 und Partitioning.
>
Das ist nicht mal in der Beta-Phase. Also für produktive Zwecke kein
sinnvoller Vorschlag.

Trotzdem schön, dass MySQL diese sinnvolle Funktion derzeit beigebracht
bekommt :)

Grüße

Dirk

Re: Archiv-Tabellen

am 24.12.2005 02:40:55 von Oliver Benning

Dirk Brosowski wrote:

[...]
> Bei vernünftigen Indizes sinkt die Performance nur unmerklich. Ich
> habe ein auslagern auch schon erfolgreich gemacht, aber die Bedingung
> "wie die aktuellen Daten verwenden zu können" gab es nicht. Diese
> Bedingung ist für mich auch entscheidend. Wenn du die Auslagerung
> machst, dann in eine Archivtabelle (statischer Name, wozu dort noch
> mehrere Tabellen?) und dann in der Applikation auf getrennte Tabellen
> reagieren, evtl. mit einem Union im SQL-Statement.

Das Problem ist, daß es weitere Tabellen gibt, deren Inhalt damit
verknüpft wird und die nicht archiviert werden. Selektiere ich nun aus
diesen Tabellen, weiss ich nicht, ob ich einen JOIN auf die aktuelle,
oder auf die Archivtabelle machen muß.

UNION fällt raus, weil ich noch für 3.23.x entwickle und 4.x leider noch
immer nicht bei vielen Providern installiert ist.

Auch wenn es nicht besonders schön ist und damit komme ich auf meine
Ursprungsfrage zurück, würde ich gerne wissen, ob man irgendwie für den
JOIN-Tabellenname in einem Select Statement den Inhalt einer Spalte
angeben kann.