Willkommen bei Entwickler-Forum.
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 13

Hybrid-Darstellung

  1. #1
    Aufsteiger
    Registriert seit
    23.05.2013
    Beitrge
    68

    Standard Resourcenschonende Lsung gesucht fr Monat und Jahrbersicht

    Hallo, ein frohes neues Jahr wnsche ich allen.

    Ich habe hier eine gigantische Datenmenge von Milliarden Daten vorliegen. Diese sollen so schonend wie mglich durchsucht werden.
    Ziel ist es von mir ist es in einem Bereich von einem Startzeitstempel bis zu einem Endzeitstempel alle Jahre in einer Spalte und alle Monate in einer Spalte zu haben.
    Leider habe ich noch berhaupt nichts gefunden was Postgresql dazu bringt dies zu tun.

    Die Zeitstempel bestimme ich einfach mit min und max
    Also SELECT MIN(Zeitstempel),MAX(Zeitstempel) from Testtabelle

    Ergibt:
    min max
    2016-09-16 11:11:00+02 2017-01-03 09:35:00+01

    so und wie kann ich den Bereich jetzt nutzen das ich am Ende das erhalte

    Jahr Monat
    2016 9
    2016 10
    2016 11
    2016 12
    2017 1
    2017 2
    usw.

    Man knnte das auch ber Group by machen aber dafr gehren demjenigen die Finger ...... na ihr wisst schon!

  2. #2
    Stammgast
    Registriert seit
    24.10.2011
    Beitrge
    1.200

    Standard

    Zitat Zitat von deathdragon Beitrag anzeigen
    Ich habe hier eine gigantische Datenmenge von Milliarden Daten vorliegen. Diese sollen so schonend wie mglich durchsucht werden.
    Ziel ist es von mir ist es in einem Bereich von einem Startzeitstempel bis zu einem Endzeitstempel alle Jahre in einer Spalte und alle Monate in einer Spalte zu haben.
    Was bedeutet "..in einer Spalte ..zu haben.."
    Bei der Ausgabe einer Datenmenge mit Zeitbereichs suche?
    Oder die Datenmenge(das Datenmodell) so zu ndern, dass der Zeitstempel redundant vorliegt und gekrzt als Jahr bzw. Monat vorliegt?

    Mal als Hinweis:
    Wenn es um eine schonende Suche in sehr groen Datenmengen geht, kann man vielleicht die tollen Indexfunktionen von PG nutzen.
    Hier bietet sich z.B. die Mglichkeit, eingeschrnkte Indizes anzulegen, die nur den gewnschten Wertebereich(!) indizieren. Dazu wird bei der Indexerzeugung dieser Wertebereich mit angegeben.
    PG ist dabei so schlau, diesen Index automatisch zu nutzen, wenn eine zum Index passende Einschrnkung in der Where Clause vorliegt. Bedeutet in der Praxis, dass man auch problemlos andere Indices auf der gleichen Spalte haben kann, es wird der beste verwendet.
    Die Performancesteigerung kann enorm sein, da auf die Art oft nur ein Bruchteil von Indexeintrgen durchlaufen wird- jenach definiertem Range.

    Die Funktion ist ungefhr ab V 9.4 oder so verfgbar, wei ich nicht auswendig.
    Gru, defo

  3. #3
    Aufsteiger
    Registriert seit
    23.05.2013
    Beitrge
    68

    Standard

    Hallo defo,

    das mit den Indizes klingt nicht schlecht. Das schau ich mir mal an. Trotzdem wrde ich es gern noch als SQL Abfrage realisieren.
    Eigentlich wrde es mir auch reichen in einem Bereich aus zwei Zeitstempeln alle Jahre zu erhalten und in einer separaten Abfrage in einem Bereich aus zwei Zeitstempeln alle Monate zu erhalten.

    Wie knnte ich das realisieren?? Gibt es da nichts von Seiten Postgresql?

  4. #4
    Stammgast
    Registriert seit
    24.10.2011
    Beitrge
    1.200

    Standard

    Ich glaube, ich habe die Frage immer noch nicht genau verstanden.
    So wie Du sie zuletzt gestellt hast und ich verstanden, kommst Du um ein Group by nicht herum, das ist auch bei keinem System anders.
    Das ist solange unproblematisch, wie der Range den Du rausbekommen willst, eine deutlich kleinere Menge ergibt, als im Ganzen vorliegt. Es wird nur der Range Bereich gruppiert. *
    Alternativ knnte man vielleicht noch mit Partitionierung arbeiten, wenn der abgefragte Bereich im Volumen doch kritisch wird.

    Die Indexfrage bezieht sich auf Range Index oder Partial Index- was ich meinte, Partial Index ist schon lter, gibt es mindestens ab 9.2 oder frher.
    Hier ist die "Problematik", dass ein Index statisch ist und ggF. angepasst, ergnzt werden muss, wenn sich die "interessanten", also abgefragten Bereiche ndern. Das wrde man bspw. ber cron jobs (bei Linux Servern) oder entsprechenden Mechanismen unter Windows Servern realisieren.

    Range Index ist flexibler, aber in ltereren Versionen nicht verfgbar, hab ich noch nicht ausprobiert.

    Hab den * vergessen:
    Es kann sein, dass die Performance trotzdem einbricht, weil der Optimizer in einer komplexen Abfrage nicht erkennt, dass er zunchst eine deutliche Reduktion der Menge bewerkstelligen knnte. Weil er also erst gruppiert und danach erst filtert. Dazu msstest Du mal die tatschlcihe Datenmenge und die tatschliche Abfrage zeigen.
    Gendert von defo (03.01.2017 um 10:45 Uhr)
    Gru, defo

  5. #5
    Aufsteiger
    Registriert seit
    23.05.2013
    Beitrge
    68

    Standard

    Hallo defo, eigentlich ist die Sache ganz einfach ich mchte zwischen zwei Zeitstempeln (anfang und ende) genau die Jahre und Monate herausfinden die dazwischen liegen. Jedoch braucht das schon so dermaen viel Leistung das ich hier eigentlich nicht mit Group by arbeiten muss! ABER! mir ist gerade eine andere Idee gekommen:
    Ziel ist es nur das Jahr und den Monat zwischen einen Timestamprange zu wissen.
    zb. zwischen 1.1.2016 (min Zeitstempel) und den 25.5.2016 (max Zeitstempel)
    dazwischen liegen folgende Ergebnistabelle:
    Monat Jahr
    1 2016
    2 2016
    3 2016
    4 2016
    5 2016

    das ist soll also das Ergebnis sein.
    Man msste doch jetzt "nur noch" abfragen if min-Zeitstempel(Jahr) <=max-Zeitstempel(jahr) then
    if min-Zeitstempel(Monat) <= max-Zeitstempel(Monat)


    USW. das sollte doch gehen?
    nur bekomme ich das nicht hin weil ich kein dunst von Postgresql habe

    ich hnge schon bei den ersten Gehversuchen fest

    DO
    $do$
    BEGIN

    if 2016 <> 2017 THEN
    select 'mist';
    else
    select 'gut';
    END if;
    END
    $do$

  6. #6
    Stammgast
    Registriert seit
    24.10.2011
    Beitrge
    1.200

    Standard

    mmh, was machst Du da?
    Hast Du Ahnung von SQL?

    Mach mal bitte:
    -- Anzahl Datenstze abfragen
    Code SQL:
    SELECT COUNT(*) FROM <MYBIGTABLENAME>;

    -- vorhandene Indizes abfragen
    Code SQL:
    SELECT t.relname AS TABLE_NAME,
           c.relname AS index_name,
           array_to_string(array_agg(a.attname), ', ') AS column_name
      FROM pg_class t, pg_class c, pg_index i, pg_attribute a
     WHERE t.oid = i.indrelid
       AND c.oid = i.indexrelid
       AND a.attrelid = t.oid
       AND a.attnum = ANY(i.indkey)
       AND t.relkind = 'r'
       AND t.relname = '<MYBIGTABLENAME>'
     GROUP BY t.relname, c.relname
     ORDER BY t.relname, c.relname

    Das sollte beides nicht weh tun, dann sehen wir weiter.

    P.S. natrlich MYBIGTABLE(NAME) ersetzen durch den richtig Namen, klein geschrieben.
    Gru, defo

  7. #7
    Stammgast
    Registriert seit
    26.02.2003
    Beitrge
    4.783

    Standard

    Hallo defo, eigentlich ist die Sache ganz einfach ich mchte zwischen zwei Zeitstempeln (anfang und ende) genau die Jahre und Monate herausfinden die dazwischen liegen.
    Was hat das mit deinen Milliarden Daten zu tun? Die zwischen 2 Zeitpunkten liegenden Monate/Jahre sind unabhngig von weiteren Daten. Da du uns aber was von Milliarden Daten erzhlst gibt es zu denen einen Zusammenhang und denn solltest du uns erzhlen. Denn davon hngt ab welche Lsung eine gute Lsung wre.

    Einfach die Monate zwischen 2 Zeitpnkten wre

    Code SQL:
    SELECT date_part('month', t), date_part('year', t) FROM generate_series( '2016-01-01'::TIMESTAMP , '2016-05-25'::TIMESTAMP, '1 month') t;

  8. #8
    Aufsteiger
    Registriert seit
    23.05.2013
    Beitrge
    68

    Standard

    so jungs! da ihr denken msst das ich hier der letzte Volldepp bin habe ich mich zurck zu den Wurzeln des bels begeben!
    Ich habe eine kleine Tabelle erstellt und mal schlank 5 Werte mit irgendeinen Zeitstempel reingeschossen!
    Danach folgende Abfrage darauf abgesetzt:

    select /*"Wert",*/

    EXTRACT(YEAR from "Timestamp_Messung"), EXTRACT(Month from "Timestamp_Messung") from "Zeiten" group by EXTRACT(YEAR from "Timestamp_Messung"),EXTRACT(Month from "Timestamp_Messung") /*,"Wert" */
    order by EXTRACT(YEAR from "Timestamp_Messung") desc

    und Bumm siehe da das Ergebnis was ich haben will ist vollstndig vorhanden!

    Nun zum groen beltter!

    Mach ich die gleich Abfrage (natrlich nur passende Stellen gendert)
    rennt er knapp 5-10 min und danach strzt mir alles ab und dabei bin ich noch auf eine sehr kleine DB mit popligen ca 200000 Datenstzen gegangen! hier ist doch irgendwas falsch! Wenn nicht geb ich meinen Job auf

  9. #9
    Stammgast
    Registriert seit
    24.10.2011
    Beitrge
    1.200

    Standard

    Ich kenne solche Effekte von Oracle, wenn
    a) ein "schlechter" Client verwendet wird
    b) falsche/ung+ltige Datumsangaben gespeichert sind (unpassend zum Datetyp)

    Abhilfe
    a) guten Client nehmen, also am einfachsten psql console
    b) ungltige Werte finden und korregieren

    Ob das hier zutrifft, kann ich natrlich nicht versprechen.

    Dann um der Sache auf die Spur zu kommen:
    Bei groen Datenmengen Arbeit erleichtern> order by erstmal weglassen
    Das Extract ggF. austauschen gegen Ralfs Funktion. (Ich wei nicht, wie aufwendig das Extract implementiert ist und was es noch alles kann) Die Typ Notation aus dem Statement von Ralf ist jedenfalls empfehlenswert
    Die Datenbank Umgebung prfen. Manchmal sind es ganz doofe Sachen. Group by und Sort brauchen viel Platz, das wird auf Platte ausgelagert, wenn RAM nicht reicht, kann schon mal klemmen, wenn Platte voll ist oder sowas. Ggf. ist das Dateisystem auch fehlerhaft. Prfen.

    Zum Thema Volldepp:
    Das hast Du gesagt, ich bin da ganz wertfrei, erlaube mir aber offensichtlich Fragen zum Kenntnisstand. Das halte ich fr legitim.
    Jeder von uns kommt im EDV Bereich immer wieder an irgendwelche Limits, dafr sind solche Foren ja da. Also nicht persnlich nehmen.

    P.S: Sehe gerade, dass ich Bldsinn geschrieben habe. Die Typ Notation in Ralfs Statement wird ja nur beim Generieren verwendet. Typnotation ist trotzdem hufig empfehlenswert, Date_Part ggF. besser implementiert.
    Und dann noch vergessen, probier mal statt group by aus, distinct zu verwenden (group by weglassen). Ist ein Voodoo Vorschlag, aber das Verhalten ist auch wirklich ungewhnlich.
    Gru, defo

  10. #10
    Aufsteiger
    Registriert seit
    23.05.2013
    Beitrge
    68

    Standard

    @defo persnlich nehme ich schon lang nichts mehr! alles gut - danke fr jeden noch so kleinen Tipp! Ich mach mich mal auf die Suche

 

 
Seite 1 von 2 1 2 LetzteLetzte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhnge hochladen: Nein
  • Beitrge bearbeiten: Nein
  •