Jsme běží databáze couval webových aplikací pro analýzu dat, v současné době na základě C#.NET s EntityFramework na server, a to především HTML+Javascript rámců na straně klienta (webový).
Naše aplikace pravidelně obdrží měření X/Y datapoints dávkovaný ve velkém množství, tj. 1e6 nebo více, nahrané uživateli nebo obdržel další infrastruktury.
V současné době máme tabulky v MSSQL tzv. Values
s id, series_id as int; x, y, z as float
. Tato tabulka je BULK INSERT
plněné s daty, když klient odešle ji, a souvisejících metadat je uložena v Series
tabulka. Celkové db velikost je v současné době blíží 1TB, 99,99%, což je Values
data.
Tento přístup byl jednoduchý na implementaci, ale to má několik nevýhod, a proto je komplikované a pomalu v průběhu času:
- musíme-li vložit do kousky, aby nepřetěžujte IIS proces, který předzpracovává to (v současné době 200'000 datových bodů za kus)
- IIS zpracovávat požadavky na paměť při VLOŽENÍ jsou obrovské (>1500 MEGABAJT za 200MB dat)
- vkládání je příliš pomalý (5 milionů záznamů jsou 100MB, to trvá >30 sekund, chcete-li vložit i pomocí HROMADNÉ VLOŽENÍ)
- během VLOŽIT celý stůl je uzamčen, tj. pouze jeden uživatel může vložit najednou
- načítání dat je také docela pomalý, žádající 1e6 záznamy někdy trvá >10 sekund
- mazání série s >1e6 záznamy pravidelně způsobuje časové limity na web app straně.
Dat není nikdy vybrány částečně, takže nepotřebujeme, aby si to v tabulce. ALE to je prosvětlením pro zobrazení před odesláním klientům, tj. 1e6 záznamy jsou ve výchozím nastavení, tj. v 99% případů použití - snížena na 2000 nebo 10 000 záznamů před odesláním klientovi. To je v mezipaměti na straně klienta, ale pokud nový klient požaduje stejnou sadu, je znovu zpracován. Hodnoty tabulky také má index na series_id
což zabere více místa na disku než samotná tabulka.
Zajímalo by mne, zda by mělo smysl změnit formát ukládání BLOB storage v "Hodnoty", s jeho vlastní formát dat (CSV nebo JSON nebo binární), a - možná - další sloupce s předzpracovaná "snížena" datové soubory pro zobrazení, které mohou být tlačil na klienty bez změny (např. v JSON). Takže nové Values
formát tabulky by bylo něco jako
id, series_id, data(blob), reduced_data(blob)
a tam bych být jen jeden Value
za Series
vstup, ne 1e6 nebo více. Snížené dataset by být vytvořen jednou, když nahraných dat je obdržel, a pak použít pro zobrazení, kdy klienti požádají
Ztratím částečné vybere z values
podle ID nebo X/Y hodnoty, ale Hodnoty nejsou nikdy Vybrány na základě nic jiného, než id
nebo series_id
takže je to v současné době není omezení. Tak tady jsou mé otázky:
- Má to smysl vůbec? Očekávám, že vytvoření a odstranění velké BLOB dataset být vždy výrazně rychlejší než vytvoření a odstranění 1.000.000 jeden záznamů. Pravda?
- Binární BLOB nebo CSV/JSON/.. BLOB? Nejjednodušší přístup pro BLOB storage je samozřejmě vytvořit obrovský CSV nebo JSON kus a uložit to (možná gzipped) v databázi. Vlastní binární formát dat by byl ještě menší, ale to by musela být převedena do JSON před odesláním klientům.
Mám pocit, že další hádka přichází s binární formáty dat nemusí být stojí za to a je lepší gzip CSV/JSON blob, než vymýšlet binární formát. Pravda?
Jak o jiné nevýhody Kuličky, které jsem dokonce ani nemusí být vědom? Omezení velikosti se nezdá být problém, varbinary(MAX)
je dostačující. Nepotřebuju, index na hodnotách uvnitř blob, jen na metadata (což je v Sérii tabulka).
Myšlenky?