Announcement

Collapse
No announcement yet.

range partition auf datum

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • range partition auf datum

    Hallo !
    Möchte meine Tabelle Partitionieren nach Datum.

    Code:
    CREATE TABLE Bestellungen
    (bestell_id     NUMBER(10) NOT NULL,
      bestell_datum   DATE   NOT NULL,
      kunden_nr   NUMBER(6)
     )
    PARTITION BY RANGE (bestell_datum)
    (PARTITION bestellung1 VALUES LESS THAN (TO_DATE('01.01.07', 'dd.mm.yyyy '))  TABLESPACE tag1,
      PARTITION bestellung2 VALUES LESS THAN (TO_DATE('02.01.07', 'dd.mm.yyyy ')) TABLESPACE tag2,
    PARTITION bestellung3 VALUES LESS THAN (TO_DATE('03.01.07', 'dd.mm.yyyy ')) TABLESPACE tag3,
    PARTITION bestellung4 VALUES LESS THAN (TO_DATE('04.01.07', 'dd.mm.yyyy ')) TABLESPACE tag4,
    PARTITION bestellung5 VALUES LESS THAN (TO_DATE('05.01.07', 'dd.mm.yyyy ')) TABLESPACE tag5,
    PARTITION bestellung5 VALUES LESS THAN (TO_DATE('06.01.07', 'dd.mm.yyyy ')) TABLESPACE tag6,
    PARTITION bestellung6 VALUES LESS THAN (TO_DATE('07.01.07', 'dd.mm.yyyy ')) TABLESPACE tag7,
    PARTITION bestellung7 VALUES LESS THAN (TO_DATE('08.01.07', 'dd.mm.yyyy ')) TABLESPACE tag8,
    PARTITION bestellung8 VALUES LESS THAN (TO_DATE('09.01.07', 'dd.mm.yyyy ')) TABLESPACE tag9,
    ...
    ...
    ...
      PARTITION bestellungn VALUES LESS THAN (MAXVALUE)
    TABLESPACE tagn
    );
    was mache ich wenn daten vom vom 01.02.07 laden möchte, dann werde sie ins ins tablespace tagn rein geladen anstatt das sie ins tablespace tag1 rein geladen werden sollten
    habt ihr vielleicht eine idee, wie ich das realiseren kann !

    vielen dank !

  • #2
    Originally posted by MR-SANSIBAR View Post
    Hallo !
    Möchte meine Tabelle Partitionieren nach Datum.

    was mache ich wenn daten vom vom 01.02.07 laden möchte, dann werde sie ins ins tablespace tagn rein geladen anstatt das sie ins tablespace tag1 rein geladen werden sollten
    habt ihr vielleicht eine idee, wie ich das realiseren kann !

    vielen dank !
    - Erstmal : Welche DB Version ? Datenvolumen ?

    - Möchtest du für den Februar auch Daten laden, so wirst du dass ganze für den Februar auch machen müssen, und März etc....
    - Oder du machst einfach Monatspartitionen (ohne Jahr), so dass Daten von Januar 2007, 2008 etc immer in derselben Partition landen. Dazu musst du das TO_DATE entpsrechend anpassen
    - Wieviel Row pro Tag erwartetst du denn,dass du Tagespartitionen erstellen willst ? Ich würde mal analysieren, ob eine Partition pro Monat nicht ausreichend ist, da du dir ansonsten einen Wolf administriert. Wenn du nur ein paar hundert Datensätze pro Partition hast, ist dass ganze sinnlos
    - Alternativ wäre, bei sehr grossen Datenmengen, evtl. auch eine Composite Partitionierung sinnvoll
    - Im übrigen muss nicht jede Partition auch einen eigenen Tablespace haben

    Comment


    • #3
      Oracle 9.2
      Also ich möchte ein Flat File einlesen und es besteht aus
      flatfile1: 6711419 Row's(9000 MB)
      flatfile2: 4975680 Row's (3000 MB)
      flatfile3: 67265 Row's (21 MB)

      die oben genannten row-Anzahlen beziehen sich auf einen Tag!
      wenn man bedenkt für ein woche oder ein monat was das für eine dimension erreicht.

      was ist deiner meinung nach empfehlenswert die Partitionsgrenze anzulegen ?

      Comment


      • #4
        Rollierende Partitionen

        Hallo MR-SANSIBAR,

        das ist ein interessantes und häufig auftretendes Problem. Mein Lösungsvorschlag: rollierende Partitionen.

        Voraussetzung: die Anzahl der Partitionen ist bekannt. Im folgenden Beispiel gehe ich davon aus, dass maximal die Daten eines Monats geladen werden sollen.

        Hash-Funktion zur Umwandlung eines Datum in einen Integer-Wert:
        Code:
        CREATE or replace Function PART_ID( p_Date in date ) return integer
        is
        BEGIN
        	return 1+mod(trunc(p_Date)-to_date('20000101','YYYYMMDD'),31);
        END PART_ID;
        /
        Deine Tabelle müsste dann um eine Spalte erweitert und mit einem Trigger versehen werden:
        Code:
        CREATE Table BESTELLUNGEN(
        		PID		number(2)	not NULL
        	,	BESTELL_ID	number(10)	not NULL
        	,	BESTELL_DATUM	date		not NULL
        	,	KUNDEN_NR	number(6)	NULL
        )
        Partition by List( PART_ID ) (
        		Partition P01 Values( 1)
        	,	Partition P02 Values( 2)
        	,	Partition P03 Values( 3)
        	,	Partition P04 Values( 4)
        	,	Partition P05 Values( 5)
        	,	Partition P06 Values( 6)
        	,	Partition P07 Values( 7)
        	,	Partition P08 Values( 8)
        	,	Partition P09 Values( 9)
        	,	Partition P10 Values(10)
        	,	Partition P11 Values(11)
        	,	Partition P12 Values(12)
        	,	Partition P13 Values(13)
        	,	Partition P14 Values(14)
        	,	Partition P15 Values(15)
        	,	Partition P16 Values(16)
        	,	Partition P17 Values(17)
        	,	Partition P18 Values(18)
        	,	Partition P19 Values(19)
        	,	Partition P20 Values(20)
        	,	Partition P21 Values(21)
        	,	Partition P22 Values(22)
        	,	Partition P23 Values(23)
        	,	Partition P24 Values(24)
        	,	Partition P25 Values(25)
        	,	Partition P26 Values(26)
        	,	Partition P27 Values(27)
        	,	Partition P28 Values(28)
        	,	Partition P29 Values(29)
        	,	Partition P30 Values(30)
        	,	Partition P31 Values(31)
        );
        
        CREATE OR REPLACE TRIGGER BIR_BESTELLUNGEN
        before INSERT on BESTELLUNGEN
        for each row
        BEGIN
         :new.PID := part_id(:new.BESTELL_DATUM);
        END BIR_BESTELLUNGEN;
        /
        Der von Ulrich Vaid angesprochene Administrations-Wolf wäre damit gezähmt, da zur Laufzeit keine Partitionen hinzugefügt oder entfernt werden müssen. Dafür muss der Ladevorgang ausprogrammiert werden. Auch hier ein Vorschlag:
        • INSERT into <temp-table> SELECT * from <external-table>
        • ALTER Table BESTELLUNGEN exchange Partition <partition> with Table <temp-table>

        Der Ladevorgang kann generisch programmiert werden, falls die Partitionsnamen nach einer festen Regel gebildet werden.

        Ich habe solche Tabellen schon mit Tagespartitionen für 3 Jahre implementiert und das Ganze läuft seit mehreren Jahren stabil und performant in Produktion.


        Viel Spaß beim Experimentieren

        Siegfried

        Comment


        • #5
          Originally posted by SiegfriedEhlert View Post
          Hallo MR-SANSIBAR,

          das ist ein interessantes und häufig auftretendes Problem. Mein Lösungsvorschlag: rollierende Partitionen.

          Voraussetzung: die Anzahl der Partitionen ist bekannt. Im folgenden Beispiel gehe ich davon aus, dass maximal die Daten eines Monats geladen werden sollen.

          Siegfried
          - Das wäre die eleganteste Lösung (wir verwenden exakt dieses Vorgehen für solch eine Anforderung. Ich bin mit aber nicht sicher, ob der OP mit Windowing arbeiten kann, jedenfalls kam es aus dem Posting nicht hervor...In Oracle 11 ist die Sache mit der Partitionierung auch eleganter zu lösen, aber dies wird sehr wahrscheinlich keine Option sein :-)))


          gruss

          Comment


          • #6
            @SiegfriedEhlert:
            Vielen Dank für dein Tip !
            ich finde dies eine super lösung.
            leider hab ich eine lösung mit range partition erwartet, wenn es dazu noch tips gibt , wäre dies natürlich auch super.

            viele grüße, mr-sansibar

            Comment


            • #7
              Originally posted by Ulrich Vaid View Post
              - Das wäre die eleganteste Lösung (wir verwenden exakt dieses Vorgehen für solch eine Anforderung. Ich bin mit aber nicht sicher, ob der OP mit Windowing arbeiten kann, jedenfalls kam es aus dem Posting nicht hervor...In Oracle 11 ist die Sache mit der Partitionierung auch eleganter zu lösen, aber dies wird sehr wahrscheinlich keine Option sein :-)))


              gruss
              Hallo Ulrich !
              Habe mir die Lösung nochmal durchgegangen, und für meinen Fall passt es nicht so ganz.

              ich stelle mir das ganz so vor !
              Habe zu Anfang 7 Partitionen (mo, di, mi, do, fr, sa, so) die werden nacheinander gefüllt für eine Woche. so jetzt habe ich wieder neue daten die physisch in part1 gehören sollten, bevor aber diese zeilen in part1 eingelesen werden, sollen vorher die alle zeilen in part1 in part 8 kopiert oder verschoben oder sogar angehängt werden, anschließend part 1 löschen. und neue part1 erstellen und dann diese neuen zeilen dort in part1 einlesen.

              auf ein tip wäre dir sehr dankbar !
              Zuletzt editiert von MR-SANSIBAR; 08.10.2007, 14:56.

              Comment

              Working...
              X