abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:11 | Nová verze

    R (Wikipedie), programovací jazyk a prostředí určené pro statistickou analýzu dat a jejich grafické zobrazení, bylo vydáno ve verzi 4.4.0. Její kódové jméno je Puppy Cup.

    Ladislav Hagara | Komentářů: 0
    včera 22:44 | IT novinky

    IBM kupuje společnost HashiCorp (Terraform, Packer, Vault, Boundary, Consul, Nomad, Waypoint, Vagrant, …) za 6,4 miliardy dolarů, tj. 35 dolarů za akcii.

    Ladislav Hagara | Komentářů: 3
    včera 15:55 | Nová verze

    Byl vydán TrueNAS SCALE 24.04 “Dragonfish”. Přehled novinek této open source storage platformy postavené na Debianu v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 13:44 | IT novinky

    Oznámeny byly nové Raspberry Pi Compute Module 4S. Vedle původní 1 GB varianty jsou nově k dispozici také varianty s 2 GB, 4 GB a 8 GB paměti. Compute Modules 4S mají na rozdíl od Compute Module 4 tvar a velikost Compute Module 3+ a předchozích. Lze tak provést snadný upgrade.

    Ladislav Hagara | Komentářů: 0
    včera 04:44 | Nová verze

    Po roce vývoje od vydání verze 1.24.0 byla vydána nová stabilní verze 1.26.0 webového serveru a reverzní proxy nginx (Wikipedie). Nová verze přináší řadu novinek. Podrobný přehled v souboru CHANGES-1.26.

    Ladislav Hagara | Komentářů: 0
    včera 04:33 | Nová verze

    Byla vydána nová verze 6.2 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Přehled změn v příslušném seznamu. Tor Browser byl povýšen na verzi 13.0.14.

    Ladislav Hagara | Komentářů: 0
    včera 04:22 | Nová verze

    Byla vydána nová verze 30.0.0 frameworku pro vývoj multiplatformních desktopových aplikací pomocí JavaScriptu, HTML a CSS Electron (Wikipedie, GitHub). Chromium bylo aktualizováno na verzi 124.0.6367.49, V8 na verzi 12.4 a Node.js na verzi 20.11.1. Electron byl původně vyvíjen pro editor Atom pod názvem Atom Shell. Dnes je na Electronu postavena celá řada dalších aplikací.

    Ladislav Hagara | Komentářů: 2
    včera 04:11 | Nová verze

    Byla vydána nová verze 9.0.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 220 vývojářů. Provedeno bylo více než 2 700 commitů. Přehled úprav a nových vlastností v seznamu změn.

    Ladislav Hagara | Komentářů: 0
    23.4. 23:22 | IT novinky

    Evropský parlament dnes přijal směrnici týkající se tzv. práva spotřebitele na opravu. Poslanci ji podpořili 584 hlasy (3 bylo proti a 14 se zdrželo hlasování). Směrnice ujasňuje povinnosti výrobců opravovat zboží a motivovat spotřebitele k tomu, aby si výrobky nechávali opravit a prodloužili tak jejich životnost.

    Ladislav Hagara | Komentářů: 9
    23.4. 16:11 | Nová verze

    Bylo oznámeno (cs) vydání Fedora Linuxu 40. Přehled novinek ve Fedora Workstation 40 a Fedora KDE 40 na stránkách Fedora Magazinu. Současně byl oznámen notebook Slimbook Fedora 2.

    Ladislav Hagara | Komentářů: 24
    KDE Plasma 6
     (72%)
     (9%)
     (2%)
     (17%)
    Celkem 726 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: Postgresql: Prosím pomoct s optimalizací dotazu

    23.3.2015 23:24 Miroslav Pavelka
    Postgresql: Prosím pomoct s optimalizací dotazu
    Přečteno: 417×
    Dobrý den, Mám tabulku minutových časových řad potřebuji z ní udělat víceminutové (15 minutové či hodinové časové řady)

    Tabulky z minutovými časovými řadami mají následující strukturu:
    CREATE TABLE admiralmarkets.m1_chfjpy
    (
      datetime timestamp without time zone NOT NULL,
      open double precision,
      high double precision,
      low double precision,
      close double precision,
      volume integer,
      CONSTRAINT m1_chfjpy_pkey PRIMARY KEY (datetime)
    )
    WITH (
      OIDS=FALSE
    );
    ALTER TABLE admiralmarkets.m1_chfjpy
      OWNER TO matlab;
    
    No a ten můj dotaz který jsem vymyslel je následující:
    SELECT
    	w.time_in_hours,
    	avg( case when r1=1 then open end ) as open,
    	max(m2) as High,
    	min(m1) as Low,
    	avg( case when r2=1 then close  end) as Close,
    	sum(w.volume) as volume,
    	count(*) as bar_count,
    	max(case when r1=1 then datetime end) as time_open,
    	max(case when m2=High then datetime end) as time_high,
    	max(case when m1=Low then datetime end) as time_low,
    	max(case when r2=1 then datetime end ) as time_close
    	--w.time_in_hours+1*interval '1 hour' as time_end
    	--- skewness--
    	--(sqrt(count(*)*(count(*)-1)))/(count(*)-2) as s0
    FROM
    	(
    SELECT
    datetime,
    	High,
    	Low,
    	Open,
    	Close,
    	volume,
    	datetime- extract (minute
    FROM
    	datetime) * INTERVAL '1 minute' as time_in_hours,
    	
    	min(low) over (partition BY datetime-extract (minute
    FROM
    	datetime) * INTERVAL '1 minute' ) as m1,
    	max(high) over (partition BY datetime-extract (minute
    FROM
    	datetime) * INTERVAL '1 minute' ) as m2,
    	rank() over (partition BY datetime-extract (minute
    FROM
    	datetime) * INTERVAL '1 minute'
    ORDER BY
    	datetime) as r1,
    	rank() over (partition BY datetime-extract (minute
    FROM
    	datetime) * INTERVAL '1 minute'
    ORDER BY
    	datetime desc ) as r2
    FROM
    	admiralmarkets.m1_usdjpy
    	
    	) as w
    GROUP BY 1 
    
    Explain analyse dalo následující výsledek:
    "GroupAggregate  (cost=576914.91..659539.99 rows=200 width=84) (actual time=4357.579..6267.656 rows=17391 loops=1)"
    "  ->  WindowAgg  (cost=576914.91..605316.25 rows=1032776 width=44) (actual time=4357.530..5175.552 rows=1032776 loops=1)"
    "        ->  Sort  (cost=576914.91..579496.85 rows=1032776 width=44) (actual time=4357.523..4566.744 rows=1032776 loops=1)"
    "              Sort Key: ((m1_usdjpy.datetime - (date_part('minute'::text, m1_usdjpy.datetime) * '00:01:00'::interval))), m1_usdjpy.datetime"
    "              Sort Method: external sort  Disk: 90824kB"
    "              ->  WindowAgg  (cost=381803.08..410204.42 rows=1032776 width=44) (actual time=2841.311..3573.644 rows=1032776 loops=1)"
    "                    ->  Sort  (cost=381803.08..384385.02 rows=1032776 width=44) (actual time=2841.305..3024.597 rows=1032776 loops=1)"
    "                          Sort Key: ((m1_usdjpy.datetime - (date_part('minute'::text, m1_usdjpy.datetime) * '00:01:00'::interval))), m1_usdjpy.datetime"
    "                          Sort Method: external sort  Disk: 82752kB"
    "                          ->  WindowAgg  (cost=186691.25..215092.59 rows=1032776 width=44) (actual time=1334.691..2102.177 rows=1032776 loops=1)"
    "                                ->  Sort  (cost=186691.25..189273.19 rows=1032776 width=44) (actual time=1334.668..1564.490 rows=1032776 loops=1)"
    "                                      Sort Key: ((m1_usdjpy.datetime - (date_part('minute'::text, m1_usdjpy.datetime) * '00:01:00'::interval)))"
    "                                      Sort Method: external merge  Disk: 62568kB"
    "                                      ->  Seq Scan on m1_usdjpy  (cost=0.00..19980.76 rows=1032776 width=44) (actual time=0.039..534.610 rows=1032776 loops=1)"
    "Total runtime: 6313.651 ms"
    
    Nejsem databázový expert.., takže kdybyste to někdo uměl zjednodušit.. nebo vymyslet něco chytřejšího... Tak díky moc. M.P.

    Odpovědi

    AraxoN avatar 24.3.2015 09:13 AraxoN | skóre: 47 | blog: slon_v_porcelane | Košice
    Rozbalit Rozbalit vše Re: Postgresql: Prosím pomoct s optimalizací dotazu
    Nemáš tam WHERE - to vždy potrebuješ výcuc zo všetkých dát? Milión záznamov (rows=1032776) po jednej minúte, to sú skoro 2 roky. Obvykle sa zobrazuje pár hodín, deň, možno mesiac. Na zobrazovanie dlhších období by som si spravil osobitné tabuľky - napríklad tabuľka po hodinách a ďalšia s dennými hodnotami (high, low, open, close, volume). Ak neprepisuješ históriu, tak Ti stačí len cronom pridávať sumárny záznam po skončení hodiny a po skončení dňa. Ten denný sumár môže byť kľudne vyrátaný z hodinových a hneď namiesto 1440 záznamov spracuvávaš len 24.
    24.3.2015 12:29 Sid
    Rozbalit Rozbalit vše Re: Postgresql: Prosím pomoct s optimalizací dotazu
    Vydal by som sa troska inym smerom : 1) Bud si robit agregacie rovno pri pridavani dat do nejakych dalsich tabuliek (tj definovat tabulky pre zadane rozsahy 15,1hod,atd) 2) v zavislosti od velkosti dat pripadne pouzit nejaku historical database napr. http://opentsdb.net/ (ale mozno je to ako ist s kanonom na vrabca)
    okbob avatar 24.3.2015 17:47 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
    Rozbalit Rozbalit vše Re: Postgresql: Prosím pomoct s optimalizací dotazu
    Nevím jestli jsem pochopil zadání - ale tady není potřeba jít do window funkcí. Pokud potřebuji agregaci po 15 minutách, tak převedu čas na 15 min intervaly a podle nich agreguji

    Pomůžu si funkcí, která mi timestamp zaokrouhluje na 15min:
    
    CREATE OR REPLACE FUNCTION trunc_15min(timestamp) returns timestamp as $$
    select to_timestamp(extract(epoch from $1)::integer/(15*60)*(15*60));
    $$ language sql;
    
    A pak agreguji obvyklým způsobem:
    postgres=# select * from foo;
                 t              | v  
    ----------------------------+----
     2015-03-24 17:32:19.318676 | 10
     2015-03-24 17:32:21.266594 | 20
     2015-03-24 17:32:23.55099  | 30
     2015-03-24 17:47:34.406007 | 30
     2015-03-24 18:02:38.235613 | 30
    (5 rows)
    
    Time: 0.409 ms
    postgres=# select trunc_15min(t), sum(v), avg(v) from foo group by 1;
         trunc_15min     | sum |         avg         
    ---------------------+-----+---------------------
     2015-03-24 18:00:00 |  30 | 30.0000000000000000
     2015-03-24 17:30:00 |  60 | 20.0000000000000000
     2015-03-24 17:45:00 |  30 | 30.0000000000000000
    (3 rows)
    
    Time: 1.789 ms
    
    24.3.2015 19:56 Miroslav Pavelka
    Rozbalit Rozbalit vše Re: Postgresql: Prosím pomoct s optimalizací dotazu
    Obávám se že bez windows funkcí to nepůjde. Je pravda že minimum a maximum můžu získat prostým groub by, ale potřebuji ještě první hodnotu (open) a poslední hodnotu (close) v daném časovém intervalu.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.