Al punto che fa la memorizzazione di una grande quantità di dati strutturati come BLOB senso?

0

Domanda

Ci sono in esecuzione di una banca dati sottoposti applicazione web per l'analisi dei dati, che attualmente si basa su C#.NET con EntityFramework sul server, e principalmente HTML+Javascript framework lato client (web based).

La nostra applicazione riceve regolarmente misura di X/Y datapoint raggruppati in grandi quantità, cioè 1e6 o più, caricate dagli utenti o ricevuti da altre infrastrutture.

Attualmente abbiamo una tabella in MSSQL chiamato Values con id, series_id as int; x, y, z as float. Questa tabella è BULK INSERT compilare con i dati quando un client si carica, e i metadati associati viene salvato in un Series tabella. Il totale db dimensione è attualmente in avvicinamento da 1TB, il 99,99% dei quali è Values dati.

Questo approccio, semplice da realizzare, ma ha diversi svantaggi che hanno reso difficile e lento nel tempo:

  • dobbiamo inserire in blocchi da non sovraccaricare il processo di IIS che preprocesses (attualmente 200'000 datapoint per blocco)
  • Processo di IIS requisiti di memoria durante INSERIRE sono enormi (>a 1500 mb per 200MB di dati)
  • l'inserimento è troppo lento (5 milioni di record sono 100MB, e questo >30 secondi per inserire anche l'utilizzo di BULK INSERT)
  • corso di INSERIRE l'intera tabella è bloccata, cioè solo un utente può inserire in un tempo
  • il recupero dei dati è anche abbastanza lento, la richiesta di 1e6 record prende a volte >10 secondi
  • eliminazione di serie con >1e6 record regolarmente cause timeout sul web lato app.

I dati non parzialmente, quindi non abbiamo davvero bisogno di avere in una tabella. MA e 'diluito' per visualizzare prima di inviare ai clienti, cioè 1e6 record - per impostazione predefinita, cioè nel 99% dei casi d'uso - ridotto a 2000 o 10'000 record prima di essere inviata al cliente. Questo viene memorizzato nella cache del client, ma se un nuovo cliente richiede lo stesso set è nuovamente elaborato. La tabella dei Valori ha anche un indice series_id il che richiede più spazio su disco rispetto alla tabella stessa.

Mi chiedo se avrebbe senso cambiare questo formato di archiviazione di un BLOB storage in "Valori" con i propri dati in formato CSV (o JSON o binario), e - forse - nelle colonne aggiuntive pre-elaborato "ridotto" set di dati per la visualizzazione che possono essere inviati al client senza modificare (es. in JSON). Così il nuovo Values tabella di formato dovrebbe essere qualcosa di simile

id, series_id, data(blob), reduced_data(blob)

e non ci sarebbe solo uno Value per Series voce, non 1e6 o più. Il ridotto set di dati viene creato una volta caricati i dati ricevuti e poi utilizzato per la visualizzazione quando la richiesta dei clienti è

Perderò parziale seleziona di values per ID o X/valore di Y, ma i Valori non sono mai Selezionato basata su qualcosa di diverso id o series_id quindi, questo è , attualmente, non una limitazione. Così qui sono le mie domande:

  • Questo ha senso a tutti? Mi aspetto che la creazione e l'eliminazione di un ampio set di dati BLOB per essere sempre notevolmente più veloce la creazione e l'eliminazione di 1.000.000 di singolo record. Vero?
  • BLOB binario o CSV/JSON/.. BLOB? L'approccio più semplice per l'archiviazione BLOB è ovviamente quello di creare un enorme CSV o JSON pezzo e salvarlo (possibilmente in formato gzip) nel database. Personalizzato formato di dati binario sarebbe ancora più piccolo, ma dovrà essere convertito in JSON prima inviato al client.

Ho la sensazione che le ulteriori fastidio di venire con i dati binari formati non possono essere la pena ed è meglio gzip CSV/JSON blob che inventare un formato binario. Vero?

Come su altri inconvenienti di Blob che io possa anche non essere a conoscenza? Limitazioni di dimensioni non sembrano essere un problema, varbinary(MAX) è più che sufficiente. Non ho bisogno di un indice sui valori all'interno di blob, solo sui metadati (che è in Serie tabella).

Pensieri?

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

Migliore risposta

1

Uno dei principali vantaggi per la memorizzazione di file nel Db è ACID (Atomicity, Consistency, Isolation, Durability), la tecnologia in DBs. Questo ci permette di inserire tutti i dati in tabelle diverse, quando si lavora sui dati. Quando è memorizzato il file nel DB, come un BLOB hai un vantaggio durante la copia di file di archiviazione, perché BLOB è più veloce l'operazione di File di Sistema, e si può facilmente il backup dei file. Ma, se la dimensione dei file per ogni record sono più di 10-50-100 MB che non è raccomandato per memorizzare i file nel BLOB. In questo caso la durata dell'inserimento di un record alla tabella magari prendere 10-15-30 secondi. Non molto bene, in quanto le transazioni di durare così a lungo, e tutti i tavoli durante la transazione in che senso sono bloccati come sapete, e il lungo blocco di questi tavoli anche causare agli utenti di essere in grado di lavorare. Uno dei modi interessanti per la memorizzazione di file come BLOB BLOB FILESTREAM tecnologia che è supportato solo da SQL Server. È possibile ottenere maggiori informazioni per questa tecnologia da questo

2021-11-18 21:34:15

Grazie per il puntatore. Ho confrontato Inserti di più blocchi di 50 mb di dati in una tabella di esempio sul nostro server di produzione e ognuno prese 1-2 secondi, il che è accettabile. Ma FILESTREAM BLOB è una buona idea anche.
Jens

In altre lingue

Questa pagina è in altre lingue

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