Estamos ejecutando una base de datos copia de la aplicación web para el análisis de datos, que actualmente se basan en C#.NET con EntityFramework en el servidor, y principalmente HTML+frameworks de Javascript en el lado del cliente (web-based).
Nuestra aplicación recibe periódicamente la medición de X/Y de puntos de datos por lotes en grandes cantidades, es decir, 1e6 o más, subido por los usuarios o recibidos por otras obras de infraestructura.
Actualmente tenemos una tabla en MSSQL llamado Values
con id, series_id as int; x, y, z as float
. Esta tabla es BULK INSERT
lleno de datos cuando un cliente se lo carga, y de los metadatos asociados se guarda en un Series
tabla. El total de tamaño de base de datos está actualmente en contacto con 1TB, el 99.99% de los que se Values
de datos.
Este enfoque fue fácil de implementar, pero tiene varios inconvenientes, que han complicado y lento a lo largo del tiempo:
- tenemos que insertar en trozos para no sobrecargar el proceso de IIS que preprocesa (en la actualidad 200'000 puntos de datos por porción)
- Proceso de IIS requisitos de memoria durante la INSERCIÓN son grandes (>1500MB de 200MB de datos)
- la inserción es demasiado lento (5 millones de registros son 100MB, esta toma >30 segundos para insertar incluso el uso de BULK INSERT)
- durante la INSERCIÓN toda la tabla está bloqueada, es decir, sólo un usuario puede insertar en un momento
- la recuperación de los datos también es bastante lento, solicitando 1e6 registros a veces tarda más de 10 segundos
- la eliminación de serie con >1e6 regularmente los registros de causas de tiempos de espera en la web app lado.
Los datos nunca es parcialmente seleccionados, así que realmente no necesita hacerlo en una mesa. PERO es 'adelgazado' para mostrar antes de que se envíe a los clientes, es decir, 1e6 registros son - por defecto, es decir, en el 99% de los casos de uso - reducido a 2000 o 10'000 registros antes de ser enviadas al cliente. Este se almacena en caché en el cliente, pero si un nuevo cliente solicita el mismo conjunto, es procesado de nuevo. Los Valores de la tabla también tiene un índice de series_id
el que ocupa más espacio en disco que la propia tabla.
Me pregunto si tendría sentido cambiar este formato de almacenamiento a un BLOB de almacenamiento en "Valores" con su propio formato de datos (CSV o JSON o binario), y - tal vez - columnas adicionales con preprocesados "reducido" de los conjuntos de datos para mostrar las cuales pueden ser enviadas a los clientes sin cambio (por ejemplo. en JSON). Por lo que el nuevo Values
formato de tabla sería algo como
id, series_id, data(blob), reduced_data(blob)
y no tendría que ser solo uno Value
por Series
de entrada, no 1e6 o más. El reducido conjunto de datos se crearía una vez cuando se cargan los datos se reciben y, a continuación, se utiliza para la visualización cuando los clientes soliciten
Voy a perder el parcial selecciona de values
por ID o X/Y de valor, pero los Valores nunca son Seleccionados basados en otra cosa que id
o series_id
así que este es en la actualidad no una limitación. Así que aquí están mis preguntas:
- ¿Tienen sentido? Espero que la creación y eliminación de un gran conjunto de datos BLOB a ser siempre mucho más rápido que la creación y eliminación de 1.000.000 de registros único. Verdad?
- BLOB binario o CSV/JSON/.. BLOB? El enfoque más sencillo para el almacenamiento de BLOBS es, por supuesto, para crear un enorme CSV o JSON fragmento y guardar (posiblemente gzipped) en la base de datos. Una costumbre formato de datos binario podría ser incluso menor, pero tendría que ser convertido a JSON antes de que se envíe a los clientes.
Tengo la sensación de que la molestia adicional que viene con el binario formatos de datos no puede ser vale la pena y es mejor gzip el CSV/JSON blob que inventar un formato binario. Verdad?
Cómo sobre otros inconvenientes de los BLOBs que me pueden incluso no ser conscientes de? Las limitaciones de tamaño, no parecen ser un problema, varbinary(MAX)
es suficiente. No necesito un índice de los valores en el interior de la nota, sólo en los metadatos (que se encuentra en la Serie de la tabla).
Los pensamientos?