Guardar en la base de datos es demasiado lento (10.000 registros por minuto)<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tengo una tabla JMP con 270.000 registros y 72 columnas.
Estoy intentando guardarlo en una base de datos a través de ODBC, pero el proceso es tremendamente lento: son unos 10.000 registros por minuto (sí, por minuto, no es un error tipográfico).
Intenté exportar tanto a un servidor Microsoft SQL Server 2014 como a un servidor PostgreSQL 9.3: la velocidad (o la falta de ella...) es la misma en ambos casos. Además, ambos servidores están en el mismo edificio que la estación de trabajo desde la que ejecuto JMP. Soy el único usuario con acceso a los dos servidores, por lo que sé que no están ocupados con nada más.
Pensé que la velocidad lenta podría deberse a que JMP intentaba calcular la longitud de los campos de texto, así que eliminé todas las columnas de texto y dejé solo campos numéricos, pero la velocidad es la misma.
Si recupero una tabla de tamaño similar de cualquier base de datos a través de ODBC, tardará menos de 20 segundos.
Las herramientas ETL que escriben en las dos bases de datos a través de ODBC o JDBC son mucho más rápidas.
¿Alguna idea sobre cómo podría acelerar la escritura en las bases de datos? A partir de ahora la función es tan lenta que prácticamente no se puede utilizar.
Gracias.
Re: Guardar en la base de datos es demasiado lento (10.000 registros por minuto)Ha habido bastantes mejoras en JMP 13 con respecto a la interacción de la base de datos.Una de las cuales es la opción Base de datos>Guardar tabla.
En JMP 13, ahora se insertan varias filas (Inserción masiva) para las bases de datos que lo admiten (que son la mayoría).Las mejoras en la interacción de la base de datos de JMP 13 también incluyen la preservación de los nombres de las columnas y los casos (cuando sea posible), así como la preservación de la información TIMESTAMP.
Re: Guardar en la base de datos es demasiado lento (10.000 registros por minuto)Nunca utilicé la opción Base de datos>Guardar tabla.En realidad, no sabía que existía hasta que leí esta publicación, así que escribí algunas de mis propias funciones de tareas comunes.Si bien creo que son lentos, al menos pueden presumir de velocidades mejores que cualquier otra cosa en este hilo.
Aquí está mi función BulkInsert:
//Insertar tabla en la base de datos..Tabla --asume coincidencias de ncols
Inserción masiva = función ({ base de datos , tabladb , dt } , { Local predeterminado } ,
//db - conexión a la base de datos
//dbTable = tabla de base de datos
//dt - tabla de datos JMP
numCols = NCols ( dt ) ;
número de filas = Nfilas ( dt ) ;
para ( i = 1 , i <= número de filas , i ++,
lista de valores = {} ;
para ( j = 1 , j <= numCols , j ++,
Si ( es fecha ( columna ( dt , j )) ,
insertar en ( lista de valores , carbonizarse ( Formato ( columna ( dt , j )[ i ] , "ddMonyyyy h:m:s" )))
,
insertar en ( lista de valores , columna ( dt , j )[ i ])
) ;
) ;
valoresTexto = sustituto ( carbonizarse ( lista de valores ) , "{" , "(" , "}" , ")" , "\!"" , "'" ) ;
sustituir en ( valoresTexto , "." , "NULO," ) ;
cadena_SQL = "Insertar en " || tabladb || "\!NORTE" ||
"Valores " || valoresTexto ;
Ejecutar SQL ( base de datos , cadena_SQL ) ;
) ;
) ;
Necesitará la función isDate que escribí y que puede encontrar aquí: ¿Existe una manera fácil de saber si una columna es Fecha/Hora?
O puede comentar esa parte del código si no tiene ninguna columna de fecha/hora.
Re: Guardar en la base de datos es demasiado lento (10.000 registros por minuto)Ahora es el año 2016 y varias versiones después. Y puedo confirmar lentitud, pero en mi caso obtengo 200 registros por minuto. Teniendo 16.064.704 registros, pasarán 2 meses antes de enviarlos a la base de datos. El botón Cancelar no funciona y la única salida es finalizar el proceso.
Por favor, haga algo al respecto; con tanto margen de mejora, ¡no debería ser tan difícil!
Re: Guardar en la base de datos es demasiado lento (10.000 registros por minuto)
BrianCorcoran wrote:
The emphasis in JMP development has been on getting data into the product. We have put considerable time into getting "block" fetching mechanisms working for Open Table, but we do not have a similar mechanism for Save Table. We have an open request to do this, but cannot commit to a specific implementation date.
Brian Corcoran
lo que efectivamente significa que la opción 'guardar en la base de datos' es completamente inútil para tablas de más de unos pocos miles de registros. Si tan solo las especificaciones de este costoso software fueran más claras...
Re: Guardar en la base de datos es demasiado lento (10.000 registros por minuto)El énfasis en el desarrollo de JMP ha estado en introducir datos en el producto.Hemos dedicado un tiempo considerable a lograr que los mecanismos de recuperación de "bloques" funcionen para Open Table, pero no tenemos un mecanismo similar para Save Table.Tenemos una solicitud abierta para hacer esto, pero no podemos comprometernos con una fecha de implementación específica.
Brian Corcoran
Re: Guardar en la base de datos es demasiado lento (10.000 registros por minuto)
PMroz wrote:
You could export the JMP dataset to a csv file, and then use the SQL Server bulk insert functionality. A bit of a kluge but it should be much faster.
Gracias. De hecho, había probado algo similar. Sin embargo, realmente me gustaría saber si hay una manera de hacer que "guardar en la base de datos" sea más rápido, es decir, factible, ya que en este momento es tan lento que no se puede utilizar.
¿Tiene algo que ver con la configuración/controladores ODBC (pero JMP es rápido para recuperar datos de las bases de datos), o así es JMP?
Re: Guardar en la base de datos es demasiado lento (10.000 registros por minuto)Puede exportar el conjunto de datos JMP a un archivo csv y luego usar SQL Server inserto a granel funcionalidad.Un poco complicado pero debería ser mucho más rápido.