Insertando 10 millones de Registros en SQL Server con C# y ADO.NET (Modo Eficiente)

preview_player
Показать описание


Рекомендации по теме
Комментарии
Автор

El comando BULK INSERT es mucho más eficiente que ir leyendo desde el fichero uno por uno e ir cargando poco a poco, ya que el comando BULK INSERT lleva la información directamente desde el fichero a la tabla y es un comando que SQL SERVER tiene muy optimizado. Además si el fichero es muy pesado se puede hacer BULK INSERT en batches con una tabla temporal de intermediaria y de esta forma evitamos bloqueos con otros procesos que puedan estar accediendo a la misma tabla.

franciscolopezrodriguez
Автор

Si tienes la informacion en un archivo de texto se podria utilizar el comando bulk insert el cual procesaria todo en 2s, mas mucho depende de la estructura con la que se guardo el txt

AAMH
Автор

Esa es la forma de desarrollar, cada codigo que se hace se debe medir en rapidez, memoria y cpu sobre todo para aplicaciones en la nube es clave por temas de facturación.

mariomp
Автор

Maravillosa manera de trabajarlo.
Me salvaste el cuello, pude adaptarlo a mi proceso donde inserto en 3 tablas diferentes, de las que en cada registro tiene un relación de Id con la primera tabla en la que inserta, pero inserto en las 3 dentro del SP poniendo el query en orden de cómo se inserta en cada tabla, uno después del otro, me sirvió muchísimo de verdad, hizo que mi aplicación sea 20 veces más eficiente para las otras personas que la usan.
Te quedo muy agradecido y quisiera consultarte cómo podría aplicarlo usando Dapper.
Saludos desde Ecuador ✌

bradygutierrez
Автор

Excelente Felipe! Muy bueno, para tener en cuenta.
Creo que como la mayoria, tambien tengo cursos tuyos en Udemy y espero alguno con microservicios, api gateway y GRPC para internossss!

enfierradosRP
Автор

Excelente video tremendamente útil para quienes desarrollamos en .Net

miguelsandoval
Автор

Excelente video, también estamos esperando el curso de .Net MAUI Blazor ....

emmanuelgt
Автор

Interesante! No habia visto esta estrategia. Generalmente utilizo SqlBulkCopy y para optimizar el uso de memoria a través de una implementación de IDataReader.

Y bueno, al final, tanto IDataReader como "yieldear", me imagino pasan a un esquema de pull (optimizando) en forma de secuencia.

cenipe
Автор

Muchas Gracias! Excelente contenido y muy útil

nelson
Автор

Muchas gracias me sirvió para un caso de uso profesional !

mykell
Автор

Muy buena explicacion, mi recomendación para que apoyes a todos tus suscriptores: Coloca una forma de descargar el código ejemplo que usas y asi podremos ser mas optimos (un proceso eficiente como tu video :-) y habla un poco mas despacio.

ProiectoERP
Автор

Excelente video y excelente explicación, te sigo hace bastante y créeme eh aprendido de ti un montón, te felicito que gran trabajo haces, saludos desde Colombia.

stevenme
Автор

Buenísimo el video Felipe, muchas gracias.

luisfernandodeolazabalsche
Автор

Buenas noches Felipe, excelente tuto! como siempre! Tengo una duda se podra realizar esto desde EF? o EF ya lo tiene integrado esto? Gracias. Saludos.

Ericelcuervo
Автор

Hola, que tal, y lo probaste un VS con el ArrayBindCount?, yo envio la data en Arrays, asi como tu SqlMetaData... y le coloco en el comand que enviare un Array, un ArrayBindCount = tamaño del array. y lo inserta de 1 solo golpe, y tambien ahorro memoria y tiempo. en micaso en ORACLE, pero asumo que el SQL seria lo mismo. PD: mi SP es muy similar al tuyo. (por ese lado no habria que modificar nada para el VS)

public async Task<int> objetos)
{
try
{
using (OracleConnection cn = new
{
await cn.OpenAsync();
int n = 0;




using (OracleTransaction tran = cn.BeginTransaction())
{
var store_id = => x.store_id).ToArray();
var secuencia = => x.secuencia).ToArray();
var resultflag = => x.resultflag).ToArray();
var resultfaultstring = =>
var status_code = => x.status_code).ToArray();

using (OracleCommand cmd = cn.CreateCommand())
{
string sql = "VTEXI_RPTASTOCKVTEX_NEW";

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = sql;
cmd.Transaction = tran;
cmd.BindByName = true;
cmd.ArrayBindCount = store_id.Length;

cmd.Parameters.Add("p_store_id", OracleDbType.Varchar2).Value = store_id;
cmd.Parameters.Add("p_secuencia", OracleDbType.Int32).Value = secuencia;
cmd.Parameters.Add("p_resultflag", OracleDbType.Int32).Value = resultflag;
cmd.Parameters.Add("p_resultfaultstring", OracleDbType.Varchar2).Value = resultfaultstring;
cmd.Parameters.Add("p_result", OracleDbType.Int32).Direction = ParameterDirection.Output;

n = await cmd.ExecuteNonQueryAsync();

var p_result =

await tran.CommitAsync();
return objetos.Count;
}
}
}
}
catch (Exception)
{
throw;
}

}

desarrolladorecommerce
Автор

Ise uno parecido metiendo un registro a una tabla pero cuando va por 300 registros me dice, que se agoto el tiempo dela conexion con sql

eliasivan
Автор

Que pasa si en lugar de mandar un un listado como el método eficiente mandas un parámetro armado en JSON ?

jesusola
Автор

Estabas usando el DataTable como un gran buffer.

motivaciontotal
Автор

Cómo controlaria que los registros llegaron completos sin quese pierda alguno en ese viaje, sea por perdida de conexion con el servidor u otras razones ----??

theonlytod
Автор

Excelente información Gavilanch2, no me sabia ese truco, pense que dentro del stored procedure ibas a utilizar un bulkcopy leyendo la ruta del archivo de texto, que es otra opción. Gracias por compartir este código.

manuelgamezz