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?