Realizujeme databázy cúval, webové aplikácie na analýzu dát, v súčasnosti na základe C#.NET s EntityFramework na server, a to najmä HTML+Javascript rámce na strane klienta (web based).
Naša aplikácia pravidelne dostáva merania X/Y datapoints spracúvať v dávkach vo veľkom množstve, t.j. 1e6 alebo viac, nahrané používateľom alebo získané prostredníctvom inej infraštruktúry.
Momentálne máme v tabuľke v MSSQL názvom Values
s id, series_id as int; x, y, z as float
. Táto tabuľka je BULK INSERT
naplnené údaje, ak klient odovzdá ho, a súvisiace metadáta uložené v Series
tabuľka. Celková db veľkosť je v súčasnosti blíži 1 TB, na 99,99%, ktorá je Values
údaje.
Tento prístup bol jednoduché implementovať, ale má niekoľko nedostatkov, ktoré urobili to zložité a pomaly v priebehu času:
- máme pre vloženie na kusy, nie preťaženie IIS proces, ktorý preprocesses to (v súčasnosti 200'000 datapoints za kus)
- IIS proces, požiadavky na pamäť, počas VLOŽIŤ sú veľké (>1500MB pre 200 MB dát)
- vloženie je príliš pomalý (5 miliónov záznamov sú 100MB, to trvá, >30 sekúnd vložiť aj pomocou VOĽNE VLOŽIŤ)
- počas VLOŽIŤ celej tabuľky je zamknuté, t. j. iba jeden užívateľ môže vložiť naraz
- preberanie údajov je tiež veľmi pomalý, žiadajúci 1e6 záznamy niekedy trvá >10 sekúnd
- vymazanie série s >1e6 záznamy pravidelne spôsobuje časové limity na web app strane.
Údaje sa nikdy čiastočne vybrané, takže nemáme naozaj potrebujete mať v tabuľke. ALE to je "štiepené" na displeji, kým odoslané klientom, t. j. 1e6 záznamy sú štandardne, t.j. v 99% prípadoch použiť - znížená na 2000 alebo 10'000 záznamov pred zaslať klientovi. Toto je cache na klienta, ale ak nový klient požaduje rovnaké, je to spracované znova. Hodnoty v tabuľke má aj index v series_id
ktorá zaberá viac miesta na disku ako stole sám.
Som zvedavý, či by malo zmysel meniť tento formát ukladania na BLOB storage "Hodnôt" s jeho vlastný formát dát (CSV alebo JSON alebo binárne), a - možno - dodatočné stĺpce s preprocessed "redukovaný" súbory údajov na displeji, ktorá môže byť tlačená na klientov bez zmeny (napr. v PIXLOCH). Takže nový Values
tabuľka formát by byť niečo ako
id, series_id, data(blob), reduced_data(blob)
a tam by byť len jeden Value
za Series
záznam, nie 1e6 alebo viac. Znížené dataset by byť vytvorený raz, keď odovzdané údaje, prijaté a potom použiť na zobrazenie, keď klienti o to požiadajú,
Som stratí čiastočné vyberie z values
podľa ID alebo X/Y hodnoty, ale Hodnoty sú nikdy Vybraných založené na nič iné ako id
alebo series_id
tak je to v súčasnosti nie obmedzenie. Takže tu sú moje otázky:
- Dáva to zmysel vôbec? Očakávam, že tvorba a zrušenie veľkej BLOB dataset byť vždy podstatne rýchlejšie, než vytvorenie a zmazanie 1 000 000 sk jednotlivých záznamov. Pravda?
- Binárne BLOB alebo CSV/JSON/.. BLOB? Najjednoduchší prístup na BLOB storage je samozrejme vytvoriť obrovský CSV alebo JSON kus a uložte ho (prípadne gzip) v databáze. Vlastný binárny formát dát by bolo ešte menšie, ale to by museli byť prevedené do JSON pred odoslané klientom.
Mám pocit, ďalšie nepríjemnosti prichádza s binárne formáty dát nemusí byť za to a je to lepšie gzip CSV/JSON objektov blob ako vymýšľať binárny formát. Pravda?
Ako sa o iných nedostatkov Guličky, ktoré som ani nemusí byť vedomí? Obmedzenia veľkosti nezdá byť problém, varbinary(MAX)
je dostačujúca. Nepotrebujem index hodnôt, vo vnútri je blob, len na metaúdajoch (ktorá je v Seriáli tabuľka).
Myšlienky?