Na kterém místě se ukládání velkého množství strukturovaných dat, jako BLOB smysl?

0

Otázka

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?

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

Nejlepší odpověď

1

Jednou z hlavních výhod pro ukládání souborů v Db je ACID (Atomicity, Konzistence, Izolace, Trvanlivost) technologie v DBs. To nám umožňuje bezpečně vložit data do jiné tabulky, když jsme pracovat na data. Když jste uloženy své soubory do DB jako BLOB máte výhodu při kopírování souborů na jiné úložiště, protože BLOB je rychlejší než operace Systému Souborů, a můžete snadno zálohovat vaše soubory. Ale, pokud vaše velikost souboru pro každý záznam jsou více než 10-50-100 MB to se nedoporučuje ukládat soubory v BLOB. V tomto případě trvání vkládání záznamů do tabulky možná 10-15-30 sekund. To není moc dobře, protože transakce trvat ani tak dlouho, a všechny tabulky během transakce v tomto smyslu jsou blokovány jak víte, a dlouho blokování těchto tabulek bude také způsobit, že uživatelé nebudou schopni pracovat. Jedním ze zajímavých způsobů, jak ukládat soubory jako BLOB je FILESTREAM objektů BLOB technologie, která je podporována pouze SQL Server. Můžete získat více informací pro tuto technologii z této

2021-11-18 21:34:15

Díky za pointer. Já vzorovým Vloží více bloků 50MB dat na příkladu tabulky na naše produkční server a každý vzal 1-2 sekund, což je přijatelné. Ale FILESTREAM objektů BLOB je taky dobrý nápad.
Jens

V jiných jazycích

Tato stránka je v jiných jazycích

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