Na ktorom mieste sa ukladanie veľké množstvo štruktúrovaných údajov, ako BLOB zmysel?

0

Otázka

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?

blob database-performance sql-server
2021-11-15 20:49:09
1

Najlepšiu odpoveď

1

Jednou z hlavných výhod pre ukladanie súborov v Db je ACID (Atomicity, Dôslednosť, Izolácia, Odolnosť) technológie v DBs. To nám umožňuje bezpečne vložte všetky údaje do rôznych tabuľkách, keď sme pracovať na údaje. Keď máte uložené svoje súbory v DB, ako BLOB máte výhodu pri kopírovaní súborov na iné skladovanie, pretože BLOB je rýchlejšie, než operácie súborového Systému, a môžete ľahko zálohovať svoje súbory. Ale, ak váš súbor veľkosti pre každý záznam je viac ako 10-50-100 MB, že nie je vhodný na ukladanie súborov v BLOB. V tomto prípade trvania vkladaní záznamov do tabuľky možno vziať 10-15-30 sekúnd. To nie je veľmi dobre, pretože transakcie posledný tak dlho, buď, a všetky tabuľky v priebehu transakcie v tomto zmysle sú blokované, ako viete, a dlho blokovanie týchto tabuľkách sa tiež spôsobiť používateľom byť schopní pracovať. Jedným zo zaujímavých spôsobov, ukladanie súborov ako BLOB je FILESTREAM BLOB technológia, ktorá je podporované iba SQL Server. Môžete získať ďalšie informácie na tejto technológie z tejto

2021-11-18 21:34:15

Vďaka za ukazovateľ. Som porovnateľné s referenčnou hodnotou Vložky z viacerých blokov 50 MB dát na príklad v tabuľke na našej produkcie server a každý vzal 1-2 sekundy, ktorý je prijateľný. Ale FILESTREAM BLOB je dobrý nápad, taky.
Jens

V iných jazykoch

Táto stránka je v iných jazykoch

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................