Que en ese momento el almacenamiento de una gran cantidad de datos estructurados como BLOB sentido?

0

Pregunta

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?

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

Mejor respuesta

1

Una de las principales ventajas para el almacenamiento de archivos en la base de datos es ACID (Atomicidad, Consistencia, Aislamiento y Durabilidad), la tecnología de la DBs. Esto nos permite insertar de forma segura todos los datos en diferentes tablas cuando trabajamos en los datos. Cuando se almacenan los archivos en la base de datos como un BLOB tiene una ventaja a la hora de copiar los archivos a otro dispositivo de almacenaje, debido a BLOB es más rápido que la operación del Sistema de Archivos, y usted puede fácilmente copias de seguridad de sus archivos. Pero, si el tamaño de archivo para cada registro son más que 10-50-100 MB que no es recomendable almacenar los archivos en el BLOB. En este caso la duración de la inserción de registros a la tabla, quizás, tomar 10-15-30 segundos. No muy bien, porque las transacciones a durar tanto tiempo, y todas las mesas durante la transacción en ese sentido están bloqueados como usted sabe, y el bloqueo largo de estas tablas también causar a los usuarios a ser incapaz de trabajar. Una de las maneras interesantes de almacenamiento de archivos como FILESTREAM BLOB BLOB es la tecnología la cual es soportada por el Servidor SQL server. Puede obtener más información de esta tecnología por parte de este

2021-11-18 21:34:15

Gracias por el puntero. Me comparan con Inserciones de varios bloques de 50 MB de datos en una tabla de ejemplo en nuestro servidor de producción y cada uno tomó 1-2 segundos, lo que es aceptable. Pero FILESTREAM BLOB es una buena idea también.
Jens

En otros idiomas

Esta página está en otros idiomas

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