Sugiero leer los datos en fragmentos:
En lugar de cargar toda la tabla, intente dividir los datos en partes e importarlos a SQL Server. Hace un tiempo, respondí una respuesta similar relacionada con SQLite, intentaré reproducirla para que se ajuste a la sintaxis de Oracle:
Guía paso a paso
En este ejemplo, cada fragmento contiene 10000 filas.
- Declarar 2 variables de tipo
Int32
(@[User::RowCount]
y@[User::IncrementValue]
) - Agregar una
Execute SQL Task
que ejecutan unselect Count(*)
y almacene el conjunto de resultados en la variable@[User::RowCount]
- Agregue un For Loop con las siguientes preferencias:
- Dentro del contenedor de bucles for agregue una
Data flow task
- Dentro de la tarea de flujo de datos, agregue un
ODBC Source
yOLEDB Destination
- En la Fuente ODBC seleccione
SQL Command
opción y escriba unSELECT * FROM TABLE
consulta *(para recuperar metadatos solamente` - Asignar las columnas entre origen y destino
- Volver al
Control flow
y haga clic enData flow task
y presiona F4 para ver la ventana de propiedades -
En la ventana de propiedades, vaya a expresión y asigne la siguiente expresión a
[ODBC Source].[SQLCommand]
propiedad:(para obtener más información, consulte ¿Cómo pasar variables SSIS en la expresión ODBC SQLCommand?)"SELECT * FROM MYTABLE ORDER BY ID_COLUMN OFFSET " + (DT_WSTR,50)@[User::IncrementValue] + "FETCH NEXT 10000 ROWS ONLY;"
Donde MYTABLE
es el nombre de la tabla de origen y IDCOLUMN
es su clave principal o columna de identidad.
Captura de pantalla del flujo de control
Referencias
- Fuente ODBC - Servidor SQL
- ¿Cómo pasar variables SSIS en la expresión ODBC SQLCommand?
- ¿CÓMO USAR LA FUENTE ODBC DE SSIS Y LA DIFERENCIA ENTRE OLE DB Y ODBC?
- ¿Cómo limito el número de filas devueltas por una consulta de Oracle después de realizar el pedido?
- Obtención de n a n filas superiores de db2
Actualización 1:otras posibles soluciones
Mientras buscaba problemas similares, encontré algunas soluciones adicionales que puede probar:
(1) Cambiar la memoria máxima de SQL Server
-
SSIS:el administrador de búfer falló en una llamada de asignación de memoria
sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'max server memory', 4096; GO RECONFIGURE; GO
(2) Habilitar canalizaciones con nombre
-
[Solucionado] El administrador de búfer detectó que el sistema tenía poca memoria virtual, pero no pudo intercambiar ningún búfer
- Ir a Panel de control -> Herramientas administrativas -> Administración de equipos
- En protocolo para instancia de SQL -> Establecer canalizaciones con nombre =
Enabled
- Reiniciar el servicio de instancia de SQL
- Después de eso, intente importar los datos y obtendrá los datos en fragmentos ahora en lugar de obtenerlos todos a la vez. Espero que funcione para ustedes y les ahorre tiempo.
(3) Si usa SQL Server 2008, instale revisiones
- El proceso de tiempo de ejecución de SSIS 2008 se bloquea cuando ejecuta el paquete de SSIS 2008 en una condición de poca memoria
Actualización 2:comprender el error
En el siguiente enlace de MSDN, la causa del error se describe de la siguiente manera:
La memoria virtual es un superconjunto de la memoria física. Los procesos en Windows generalmente no especifican cuáles deben usar, ya que eso inhibiría (en gran medida) la forma en que Windows puede realizar múltiples tareas. SSIS asigna memoria virtual. Si Windows puede hacerlo, todas estas asignaciones se mantienen en la memoria física, donde el acceso es más rápido. Sin embargo, si SSIS solicita más memoria de la que está disponible físicamente, esa memoria virtual se derrama en el disco, lo que hace que el paquete funcione mucho más lento. Y en el peor de los casos, si no hay suficiente memoria virtual en el sistema, el paquete fallará.