Die ältesten 10 % aus Oracle-Tabelle löschen ?

Ich habe eine Oracle-Tabelle, die langsam zu groß wird. Alle Einträge haben ein Datum. Kann ich z.B. die ältesten 10 Prozent der Einträge löschen und wie könnte das gehen ?
Klar, ich habe die Anzahl der Einträge, ich kenne „order by“, aber wie kann ich in einer Tabelle positionieren ? „Rownum“ scheint dafür nicht geeignet zu sein - oder doch ?
Gruß Rupert

Ich habe eine Oracle-Tabelle, die langsam
zu groß wird. Alle Einträge haben ein
Datum. Kann ich z.B. die ältesten 10
Prozent der Einträge löschen und wie
könnte das gehen ?

Hallo Rupert,
ich hoffe, Du willst nicht ein einziges
SQL-Kommando daß das erledigt. In mehreren Schritten geht’s folgendermaßen:

Angenommen Du hast eine Tabelle „AUFTRAG“, in der eine Spalte „ANTRAGSDATUM“ steht. Mit:

SELECT MIN(ANTRAGSDATUM), MAX(ANTRAGSDATUM)-MIN(ANTRAGSDATUM)

findest Du den kleinsten Wert sowie den maximalen Abstand (ältester und neuester Eintrag). Du kannst nun alle Datensätze
löschen, deren ANTRAGSDATUM über einem bestimmten Datum liegt (also das kleinste
plus 10 % vom ausgegebenen Abstand)

DELETE FROM AUFTRAG
WHERE ANTRAGSDATUM

Hallo Ralf,

recht herzlichen Dank. Ich habe deine Idee natürlich gleich umgesetzt: im Testbeispiel sind 10 Prozent der Einträge 347 rows. Kleinstes Datum war 944160750 (Unix), die Differenz zum größten war 419866. Wenn ich alles löschen würde, was kleiner als 944202736 ist, wären das 419 rows. Die Verteilung ist also nicht ganz gleich, das stört aber nicht.

Viele Grüße
Rupert

Was passiert denn bei deinem Vergleich nach 1999 ?

Was passiert denn bei deinem Vergleich
nach 1999 ?

Hallo Daniel,
die Unix-Zeitrechnung begann am 1.1.1970
und wird in Sekunden seit diesem Zeitpunkt gerechnet. Beim Datentyp unsigned long hat eine Zahl bis 4 Milliarden Platz und das reicht bis zum Jahre 2106: „apres moi le deluge“
Gruß
Rupert

Wandelst Du das Datum nicht um?
Ich dachte so etwas gesehen zu haben…
Wenn das so ist, dann mueste der umgewandelte Wert ab 00 groesser sein als
als der von 99.

gruss, daniel

die Unix-Zeitrechnung begann am 1.1.1970
und wird in Sekunden seit diesem
Zeitpunkt gerechnet. Beim Datentyp
unsigned long hat eine Zahl bis 4
Milliarden Platz und das reicht bis zum
Jahre 2106: „apres moi le deluge“

AFAIK wird ein SIGNED LONG verwendet, die Zeit läuft also „schon“ im Jahr 2038 über (deckt sich auch mit Aussagen von Unix-Sysadmins zur Frage des Y2K-Problems auf Unix-Maschinen). Ich gehe mal davon aus, daß innerhalb der nächsten 38 Jahre das 32-Bit-Unix nicht mehr sooo sehr weit verbreitet sein wird :smile:

Abgesehen davon verwendet Oracle nicht die Unix-Zeitbasis für Felder vom Datentyp DATE. Hier wird eine Float-Zahl verwendet. Der Ganzzahlige Teil sind die Tage, der gebrochene die Stunden, also z.B. 0.25 Tage sind 6 Stunden. Ist auch irgendwie viel logischer als die Sekundenrechnerei.

Hallo Ralf und Daniel,
vielen Dank dass ihr so gut mitdenkt. In meinem „date_reception“-Feld steht von Anfang an die Unix-Zeit und definiert ist es als „number(38)“. Ich werde diese Art Probleme also nicht mehr bearbeiten müssen.
Gruß, Rupert

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]