Almacenar ~ 3.5TB de datos e insertar aproximadamente 1K / seg 24x7, y también realizar consultas a una velocidad no especificada, es posible con SQL Server, pero hay más preguntas:
- ¿Qué requisito de disponibilidad tienes para esto? 99,999% de tiempo de actividad, o es suficiente el 95%?
- ¿Qué requisito de fiabilidad tienes? ¿Falta un inserto le cuesta $ 1 millón?
- ¿Qué requisito de recuperabilidad tienes? Si pierde un día de datos, ¿importa?
- ¿Qué requisito de consistencia tienes? ¿Es necesario garantizar que una escritura sea visible en la siguiente lectura?
Si necesita todos estos requisitos que destaqué, la carga que propone costará millones en hardware y licencias en un sistema relacional, cualquier sistema, sin importar los trucos que intente (fragmentación, partición, etc.). Un sistema nosql, por su propia definición, no cumpliría con todos estos requisitos.
Entonces, obviamente, ya ha relajado algunos de estos requisitos. Hay una buena guía visual que compara las ofertas de nosql según el paradigma 'elegir 2 de 3' en Visual Guide to NoSQL Systems :
Después de la actualización del comentario OP
Con SQL Server, esta sería una implementación sencilla:
- una sola clave de tabla agrupada (GUID, hora). Sí, se va a fragmentar , pero si la fragmentación afecta las lecturas anticipadas y las lecturas anticipadas solo se necesitan para escaneos de rango significativo. Dado que solo consulta por GUID y rango de fechas específicos, la fragmentación no importará mucho. Sí, es una clave ancha, por lo que las páginas que no son hojas tendrán una densidad de clave baja. Sí, dará lugar a un factor de llenado deficiente. Y sí, pueden ocurrir divisiones de página. A pesar de estos problemas, dados los requisitos, sigue siendo la mejor opción de clave agrupada.
- particione la tabla por tiempo para que pueda implementar la eliminación eficiente de los registros caducados, a través de una ventana deslizante automática . Aumente esto con una reconstrucción de la partición de índice en línea del último mes para eliminar el factor de relleno deficiente y la fragmentación introducida por el agrupamiento GUID.
- habilitar la compresión de página. Dado que los grupos de claves agrupados por GUID primero, todos los registros de un GUID estarán uno al lado del otro, lo que brinda a la compresión de página una buena oportunidad para implementar la compresión de diccionario.
- necesitará una ruta de E / S rápida para el archivo de registro. Está interesado en un alto rendimiento, no en una baja latencia para que un registro se mantenga al día con 1K inserciones / seg, por lo que la eliminación es imprescindible.
El particionado y la compresión de páginas requieren cada uno de un servidor SQL de Enterprise Edition, no funcionarán en Standard Edition y ambos son muy importantes para cumplir con los requisitos.
Como nota al margen, si los registros provienen de una granja de servidores web front-end, pondría Express en cada servidor web y en lugar de INSERT en el back-end, colocaría SEND
la información en el back-end, utilizando una conexión / transacción local en el Express coubicado con el servidor web. Esto le da una historia de disponibilidad mucho mejor a la solución.
Así que así es como lo haría en SQL Server. La buena noticia es que se comprenden bien los problemas que enfrentará y se conocen las soluciones. eso no significa necesariamente que sea mejor que lo que podría lograr con Cassandra, BigTable o Dynamo. Dejaré que alguien más conocedor de cosas no sql-ish argumente su caso.
Tenga en cuenta que nunca mencioné el modelo de programación, la compatibilidad con .Net y demás. Sinceramente, creo que son irrelevantes en grandes implementaciones. Hacen una gran diferencia en el proceso de desarrollo, pero una vez implementados, no importa qué tan rápido fue el desarrollo, si la sobrecarga de ORM mata el rendimiento :)