Time Series Database

0

Cześć

Chciałem kontynuować temat tutaj: Wolny Npgsql ale będzie on teraz bardziej dotyczył samych baz danych.

Sprawa wygląda tak, iż posiadam dostęp do danych historycznych giełdowych(amerykańskich) które sam analizuje. Robiłem to wcześniej za pomocą paru skryptów napisanych PHP/PERL. Problem się pojawił wraz ze wzrostem ilość danych(dlatego tez ruszyłem z nauką C#). Aktualnie SELECT`uje tabele o ilość rekordów wynoszących do 5mln. Tabela jest umieszczona w PostgreSQL ponieważ obsługuje milisekundy. Niektóre SELECTy dość długo trwają, szczególnie te w których przeszukuje według zasięgu czasu. Danych będzie mi przybywać dlatego chce przejść na TSDS.
Tabela ma taką strukturę:

 
symbol text NOT NULL, // symbol spolki
czas timestamp without time zone NOT NULL, // czas w którym zaszła transakcja
ilosc integer NOT NULL, // ilość akcji
cena double precision NOT NULL, // po jakiej cenie
kod1 "char" NOT NULL, //  
kod2 "char" NOT NULL, //
kod3 integer NOT NULL, //

Na wikipedii(http://en.wikipedia.org/wiki/Time_series_database) znalazłem listę takich baz:

*Apache Cassandra
*CouchDB
*Couchbase
*Eventual Consistency
*HBase (Hadoop)
*MongoDB
*Neo4j
*RavenDB
*Riak
*Redis

I tu pytanie do was o opinie co do tych baz oraz jak się ma sama składnia SQL w takich bazach(np czy istnieje DISTINCT, COUNT i inne dość często wykorzystane funkcje w RMBSach) ?

A może jakiś inny pomysł ?

Dzięki i pozdrawiam
dawid

0

Próbowałeś nałożyć indeks na pole czasu?
PostgreSql spokojnie sobie radzi sobie z dużo większymi tabelami, a 5 mln w dzisiejszych czasach to nie wiele.
Proponuję zamieścić tutaj zapytania jakie wykonujesz - może nie są optymalne?

Jeżeli chcesz możesz też się zainteresować darmowym MS SQL Express bądź Oracle Express - teraz ograniczenia wynoszą 10 GB na bazę więc zmieścisz w tym dużo danych.

Edit
Po dużym insercie do PostgreSql uaktualnij też statystyki.

0

Testowałem trochę te indeksy które utworzyłem i czas skrócił się niesamowicie - do parunastu sekund dla 3,5 mln rekordów dla takiego zapytania:

SELECT * FROM (SELECT DISTINCT(czas) as t, COUNT(*) as c FROM historia WHERE symbol = ? AND ilosc = 100 GROUP by czas ORDER BY c DESC LIMIT 100) as tmp WHERE c >= 10";
 

indeksy:

 
find_idx: CREATE INDEX find_idx ON historia USING btree (symbol, czas, ilosc, kod1) 	
historia_pkey: CREATE UNIQUE INDEX historia_pkey ON historia USING btree (id) 		
symbol_idx: CREATE INDEX symbol_idx ON historia USING btree (symbol)

Resztę testów zostawię sobie na weekend. Załaduje do bazy 100mln rekordów, zobaczymy.

Znów wielkie dzięki ozi

Dobrej nocy

1 użytkowników online, w tym zalogowanych: 0, gości: 1