Estamos planificando implementar un sistema para registrar una alta frecuencia de marcas de mercado en una base de datos para su posterior análisis. Para obtener un poco de qué tipo de rendimiento de almacenamiento podemos obtener en las diferentes soluciones de BD, creé una pequeña aplicación para insertar una fila básica de información de marca. Cuando ejecutamos el mismo código en un par de DB diferentes obtuvimos algunos resultados interesantes.Rendimiento de inserción de base de datos
se insertan los datos es muy simple como sigue:
CREATE TABLE [dbo].[price](
[product_code] [char](15) NULL,
[market_code] [char](10) NULL,
[currency] [nchar](6) NULL,
[timestamp] [datetime] NULL,
[value] [float] NULL,
[price_type] [char](4) NULL
) ON [PRIMARY]
Microsoft SQL Server:
Tiempo total de la prueba: 32 segundos. 3,099 precios por segundo.
servidor MySQL:
Tiempo total de la prueba: 18 segundos. 5,349 precios por segundo.
MongoDB Servidor:
Tiempo total de la prueba: 3 segundos. 25,555 precios por segundo.
El propósito de esta prueba es simplemente obtener una pequeña indicación de qué tipo de "rendimiento bruto" se puede esperar de los sistemas en la parte inferior. Cuando realmente implementamos una solución, por supuesto, hacemos buffering, inserciones masivas, etc.
Solo nos preocupa la velocidad de las inserciones, ya que la consulta se realiza "fuera de línea" más tarde.
¿Alguien tiene alguna sugerencia para otras bases de datos que podrían caber? Voy a intentar con HDF5 y MonetDB más tarde esta noche también. Es necesario tener acceso de múltiples clientes.
¡Gracias por cualquier sugerencia!
Actualizado:
Lo sentimos, pero hice una edición mayor de mi pregunta antes de postular, y parece que me he dejado las versiones de servidor y algunos detalles del hardware. Todas las pruebas se realizaron en un servidor de 8 núcleos con 12 GB de RAM con Windows 2008 x64.
Microsoft SQL Server 2008 Enterprise x64. MySQL 5.1.44 ejecutándose como tabla InnoDB. MongoDB 1.2.4 x64
La prueba actual es un simple bucle de inserciones de fila en los DB con datos históricos reales de NASDAQ compilados en un archivo CSV ya importado a la memoria. El código estaba en C# NET4 x64.
Los servidores MS SQL y MySQL se "ajustaron" a la configuración perfecta, mientras que el MongoDB se acaba de configurar con los valores predeterminados. Las tablas SQL están configuradas sin índices, ya que el propósito de la base de datos es simple como una base de etapas antes de ser transferido al sistema de análisis principal.
Muchas inserciones masivas sugeridas, sin embargo, es una forma difícil de hacerlo, ya que tenemos varios clientes presionando ticks simples en la base de datos independientemente de las transmisiones en vivo. Para permitir tales métodos, tendríamos que expandir la capa frente a la base de datos más allá de lo que tenemos la oportunidad de probar en este momento. Sin embargo, imagino que habrá que hacer algo para la arquitectura final, ya que los números que obtenemos de todo, excepto el MongoDB, no son suficientes para manejar la cantidad de entradas necesarias.
ACTUALIZACIÓN 2: las unidades SSD son ideales para esto, y lo estamos utilizando nosotros mismos. Sin embargo, el producto final se instalará en unos pocos clientes diferentes, que todos proporcionan su propia plancha .. y conseguir los servidores del departamento de TI con SSD es todavía difícil ... :(
Actualización 3:
Probé el enfoque bulkcopy sugirió rendimiento para el mismo bucle, como las otras, pero por primera vez en un DataTable y luego BulkInsert en el SQL Server como resultado la siguiente:.
Microsoft SQL Server (a granel):
total de la prueba tiempo: 2 segundos. 39401 precios por segundo re.
Debe probar con amortiguación y granel insertos también. También asegúrese de usar los mismos índices y restricciones que el sistema real, y realice la prueba con un Db que esté razonablemente lleno. –
Recuerde también que el hardware es muy importante aquí, por ejemplo, algunas unidades SSD de gama alta ofrecerán un rendimiento tremendamente mejor, así que mire dónde gasta su dinero para ver cuánto importa. –
¿Los está probando en la misma máquina? ¿Estás usando la edición express del servidor sql? –