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

Curso: Aprende ASP.NET Core MVC haciendo proyectos: felipe-gavilan...
Todos mis cursos descuento: www.felipe-gav...
Código en github: github.com/gav...

Пікірлер: 96

  • @gavilanch2
    @gavilanch22 жыл бұрын

    Curso: Aprende ASP.NET Core MVC haciendo proyectos: felipe-gavilan.azurewebsites.net/api/Redireccion?curso=asp-net-core-mvc-esp Todos mis cursos descuento: www.felipe-gavilan.com/cursos?idioma=esp Código en github: github.com/gavilanch/DiezMillonesDeRegistros/tree/main

  • @isidroosorio5251

    @isidroosorio5251

    2 жыл бұрын

    Buenos días!. En este curso está incluido el ejemplo de Insertando 10 millones de Registros en SQL Server con C# y ADO.NET ?

  • @Emi-fg7fn

    @Emi-fg7fn

    2 жыл бұрын

    Una pregunta, el trúncate no afectaría al método eficiente? el metodo eficiente envia un solo registro al procedimiento y ahi el procedimiento lo carga en la base de datos, luego vuelve a repetir y asi por cada registro del archivo, pero como el procedimiento tiene el trúncate, esto no haría que no llegue a insertar todos los datos? porque por cada iteración va a borrar todo lo que esta en la tabla y luego va a insertar. Por otro lado, otra opción interesante es usar bulk insert

  • @maclaren33

    @maclaren33

    Жыл бұрын

    Si vi ese pero esta mezclado con Asp. Net yo solo quiero la parte de apis sin Asp

  • @felixsolano156

    @felixsolano156

    Жыл бұрын

    como seria con alway encripter, ahi no funciona read only para realizar un insert select

  • @franciscolopezrodriguez4092
    @franciscolopezrodriguez40922 жыл бұрын

    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.

  • @pabloguruguay

    @pabloguruguay

    2 жыл бұрын

    Hola, como un aporte te comento que en pruebas reales realizadas para hacer la carga de un archivo de 11 millones de registros de campo único de largo de 300 caracteres el metodo eficiente demoro 120 segundos en promedio contra 200 segundos promedio del bulk. Se hicieron diferentes pruebas, pero hubo una que nos sorprendio de cargar el metodo eficiente en 40 segundos si el sql, el archivo y el proceso se encontraban en el mismo servidor, algo que habitualmente no ocurre por razones de seguridad.

  • @franciscolopezrodriguez4092

    @franciscolopezrodriguez4092

    2 жыл бұрын

    @@pabloguruguay me sorprende lo que comentas, llevo varios años trabajando en proyectos de etl y el método que se comenta aquí como más eficiente suele ser el que genera cuello de botella en movimiento masivo de datos. En el proyecto que me encuentro actualmente tenemos procesos que mueven miles de millones de datos al día con registros que tienen incluso varchar(Max) y te puedo asegurar que cuando pretendemos optimizar dichos procesos para en lugar de mover los datos uno a uno en modo streaming lo hacemos mediante BULK INSERT directos desde la BBDD la velocidad del procesos se multiplica bastante. No sé si tal vez el problema de vuestras pruebas es el blob storage o el servidor donde alojeis el fichero que tuviera mala conectividad con la base de datos. Además parece lógico que un BULK INSERT sea más rápido ya que a diferencia del método eficiente que se comenta en el vídeo, el registro no ha de pasar por ningún intermediario, sino que se crea una conexión directa entre el origen y el destino, a diferencia del método comentado en el vídeo que obliga a pasar del fichero a memoria y de memoria a BBDD. Adicionalmente hay otros métodos más eficientes, como por ejemplo recurrir a procesamiento distribuido como el que nos puede proporcionar Apache Spark.

  • @harvey2010yt

    @harvey2010yt

    2 жыл бұрын

    Te comento, nosotros tenemos que insertar volúmenes de datos considerablemente grandes a SQL, día a día (actividad de monitoreo de ~200 parámetros cada 10s). Se arma es archivo de texto y se envía por C# a un comando BULK INTERT. Creo que no puede haber un método más rápido y simple. De acuerdo con tu comentario.

  • @carloszuniga3311

    @carloszuniga3311

    Жыл бұрын

    No olvidemos que aparte del método, ya sea BULK INSERT o por C#, hay que tener en cuenta el rendimiento, las características del servidor o PC ya que procesara estos trabajos masivos.

  • @TheDarkghetto666

    @TheDarkghetto666

    Жыл бұрын

    @@franciscolopezrodriguez4092 cuanto demora yo tengo una tabla de 700 millones de registros cuanto demoraria con build insert?

  • @mariomp4973
    @mariomp49732 жыл бұрын

    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.

  • @AAMH14
    @AAMH142 жыл бұрын

    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

  • @Jel.Awesh.M

    @Jel.Awesh.M

    2 жыл бұрын

    ¿Probaste carga los 10M registros con Bulk Insert y tomó 2 segundos?

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Haz la prueba y sube tu código a github. Así hago un video del tema y compartimos tu estrategia. Saludos!

  • @DiegoAlbertoOrtegaCarreto

    @DiegoAlbertoOrtegaCarreto

    2 жыл бұрын

    Tal vez no tardaría 2s pero si algo muy similar. Otra manera es meter info como JSON. 10 millones realmente no es mucha información.

  • @victorsandoval6501

    @victorsandoval6501

    2 жыл бұрын

    +1 bulk insert es súper eficiente, adicionalmente yo recomiendo usar un caché de disco , p.ej. primo caché, con defer write para que todo se procese en la ram y después se guarde gradualmente en el disco. Si usas MySQL el homónimo es load data y hasta permite actualizar/insertar. 😀

  • @sarracenogamer7375

    @sarracenogamer7375

    2 жыл бұрын

    Cuando comentáis el comando Bulk Insert, sería ejecutarlo desde SQL Server o desde C#? Que este último también tiene el comando Bulk insert

  • @bradygutierrez2613
    @bradygutierrez26134 ай бұрын

    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 ✌

  • @gavilanch2

    @gavilanch2

    3 ай бұрын

    Me alegro que te sirviera. Honestamente no lo he hecho con Dapper. Veo que tienen Bulk Insert, pero veo que es una opción paga: www.learndapper.com/bulk-operations/bulk-insert

  • @enfierradosRP
    @enfierradosRP2 жыл бұрын

    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!

  • @rickytm

    @rickytm

    2 жыл бұрын

    Excelente idea! X2

  • @miguelsandoval3345
    @miguelsandoval33452 жыл бұрын

    Excelente video tremendamente útil para quienes desarrollamos en .Net

  • @emmanuelgt
    @emmanuelgt2 жыл бұрын

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

  • @Gilgameshx

    @Gilgameshx

    2 жыл бұрын

    Definitivamente ese también es uno de los que más estoy esperando y espero que MAUI integre mudblazor

  • @cenipe133
    @cenipe1332 жыл бұрын

    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.

  • @nelson3391
    @nelson3391 Жыл бұрын

    Muchas Gracias! Excelente contenido y muy útil

  • @juanbustosv
    @juanbustosv Жыл бұрын

    ¡Genial!

  • @mykell5423
    @mykell54232 жыл бұрын

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

  • @22Ericelcuervo
    @22Ericelcuervo Жыл бұрын

    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.

  • @ProiectoERP
    @ProiectoERP2 жыл бұрын

    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.

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Gracias por el feedback, el código se encuentra en la descripción del video (link de github)

  • @motivaciontotal5310
    @motivaciontotal53102 жыл бұрын

    Estabas usando el DataTable como un gran buffer.

  • @Miguel140370
    @Miguel1403702 жыл бұрын

    Muy útil tu video... muchas gracias

  • @grbsql
    @grbsql2 жыл бұрын

    Excelente video. Felicitaciones

  • @desarrolladorecommerce6200
    @desarrolladorecommerce62002 жыл бұрын

    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 SetInsBulkStockSkuAsync(List objetos) { try { using (OracleConnection cn = new OracleConnection(CadenaConexion())) { await cn.OpenAsync(); int n = 0; using (OracleTransaction tran = cn.BeginTransaction()) { var store_id = objetos.AsEnumerable().Select(x => x.store_id).ToArray(); var secuencia = objetos.AsEnumerable().Select(x => x.secuencia).ToArray(); var resultflag = objetos.AsEnumerable().Select(x => x.resultflag).ToArray(); var resultfaultstring = objetos.AsEnumerable().Select(x => x.resultfaultstring).ToArray(); var status_code = objetos.AsEnumerable().Select(x => 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 = cmd.Parameters["p_result"].Value; await tran.CommitAsync(); return objetos.Count; } } } } catch (Exception) { throw; } }

  • @eliasivan1240
    @eliasivan1240 Жыл бұрын

    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

  • @theonlytod
    @theonlytod Жыл бұрын

    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 ----??

  • @stevenme2991
    @stevenme29912 жыл бұрын

    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.

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Gracias 🙌

  • @jesusavelar3413
    @jesusavelar3413 Жыл бұрын

    en el minuto 5:36 comando.Parameters.Add(parametro) solo agrega un registro aunque trae 9mil, saben por que será?

  • @oscarhernandez-ig8dj
    @oscarhernandez-ig8dj Жыл бұрын

    Alguien sabe si es mas eficiente mandar un json y en sql server convierta el json a tabla para poder almacenarlo?

  • @jesusola5976
    @jesusola5976 Жыл бұрын

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

  • @matamba100
    @matamba100 Жыл бұрын

    y si es al contrario ? necesito cargar los datos sin consumir mucha memoria

  • @MiguelAngel180
    @MiguelAngel1802 жыл бұрын

    Excelente 👏👏👏

  • @jscode_es
    @jscode_es2 жыл бұрын

    Tiene este mismo contenido para mysql para implementarlo en una app de nodejs

  • @manuelgamezz
    @manuelgamezz2 жыл бұрын

    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.

  • @jeffreyguette988
    @jeffreyguette988 Жыл бұрын

    en caso tal se necesite insertar datos pero tengo 126 columnas, si sería eficiente este metodo?

  • @luisfernandodeolazabalsche3317
    @luisfernandodeolazabalsche33172 жыл бұрын

    Buenísimo el video Felipe, muchas gracias.

  • @freddycancino1
    @freddycancino12 жыл бұрын

    Excelente video, por favor como seria la manera eficiente de obtener una gran cantidad de datos de SQL hacia C#, gracias.

  • @christianmagnus1003
    @christianmagnus10032 жыл бұрын

    Hola muy interesante el video, básicamente ese yield es el que libera la memoria y hace que el proceso se ejecute de forma ordenada por así decirlo en vez de mapear todo en un datatable que queda en memoria antes de enviar a db, podrías pasar el txt con los 10 millones de registros? gracias.

  • @aojalla
    @aojalla2 жыл бұрын

    Muy buen video !!!

  • @manuelbello4663
    @manuelbello46632 жыл бұрын

    Excelente explicacion, Pregunto: Ud utiliza SqlConnection y SqlCommand para hacer el proceso, cuando se crea un proyecto en net core 6 mvc codefirst, alli se utiliza el framework, hay desventaja en cuanto a tiempo y recurso de maquina?

  • @matiasdellea444
    @matiasdellea4442 жыл бұрын

    Hola!!! MUY INTERESANTE!!! felicitaciones por tu video, paso a hacer una consulta que quizas desde mi punto de vista junior nunca pude solucionar, yo tengo un problema al levantar y leer datos desde una base de datos sql server, la base tiene potencia suficiente ( es un cliente que no tiene problemas de pagar el mejor servicio en azure ya que son parte de microsoft ) pero yo para una web app necesito leer de una tabla que tiene 5000 registros, el tema es que necesito leer casi 20 columnas por cada uno de estos registros, al levantar con un select y cargar en la vista el sitio se pone lento durante unos segundos, y descubri que estaba limitado por esta funcion dentro de mi startup : services.Configure(options => options.ValueCountLimit = 5000); Yo lo movi a 5000 ( estaba en 1500 y me fallaba la vista ), actualmente tengo 4200 registros, pero es lerdisima la carga, alguna solucion de potencia y rendimiento para esto ?

  • @CarlosGomez-np5nv
    @CarlosGomez-np5nv2 жыл бұрын

    Excelente video, tengo una pregunta, si por alguna razón loca, quisieras mostrar todos esos registros en una gridview, cual seria la forma más eficiente de hacerlo ?

  • @jorgealexanderespinozaveli841
    @jorgealexanderespinozaveli8412 жыл бұрын

    Comparando el método eficiente vs un ETL en SSIS ¿Cuál es mejor en tiempo y en uso eficiente de memoria? Muchas gracias

  • @TheDarkghetto666
    @TheDarkghetto666 Жыл бұрын

    profeosr y como generas el archivo con la data?

  • @88TonyStark88
    @88TonyStark882 жыл бұрын

    Cuál es la configuración de memoria y cpu que utilizas? Me da la impresión que la diferencia de tiempo es por otra cosa

  • @hector9079
    @hector90792 жыл бұрын

    Muy bueno 👍🏾

  • @alejandromartinezramirez3312
    @alejandromartinezramirez33122 жыл бұрын

    Profe algun ejemplo de exportar a excel y recibirlo en react js?

  • @andresfelipecedielhurtado4851
    @andresfelipecedielhurtado48512 жыл бұрын

    Muy buen video, podrías tambien hacer la prueba con una base de datos que no este en tu misma red, cual sería la diferencia en tiempo de ejecución.

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Es que lo importante es la comparación, no el tiempo de ejecución en sí.

  • @jesusguevara8378
    @jesusguevara83782 жыл бұрын

    Oye y en cuanto a seguridad es viable meterle más validaciones al procedimiento almacenado?

  • @jrequenag
    @jrequenag2 жыл бұрын

    Esta Genial, ahora pregunta como se hace esto con entity :D

  • @egcoolmauricio

    @egcoolmauricio

    2 жыл бұрын

    EF tiene una un metodo SqlQuery que te permite ejecutar sps, seria casi de la misma manera

  • @maclaren33
    @maclaren33 Жыл бұрын

    En tus cursos de udemy no tienes o no vas a hacer alguno de apis únicamente desde 0 a experto utilizando net core 6. Esto para ser consumido por cualquier plataforma no importa cual pero todo enfocado únicamente a la creación de apis y la seguridades con token y todo eso?

  • @gavilanch2

    @gavilanch2

    Жыл бұрын

    Buenas, Daniel, Pues este es de APIs: www.udemy.com/course/construyendo-web-apis-restful-con-aspnet-core?couponCode=2022OCTUBRE Saludos!

  • @Emi-fg7fn
    @Emi-fg7fn2 жыл бұрын

    Muy buen video, justo me calló como anillo al dedo, justo me tocaba hacer una implementación similar. Una consulta, mas o menos como se llama el video que comentas sobre el procedimiento almacenado?

  • @Emi-fg7fn

    @Emi-fg7fn

    2 жыл бұрын

    no pregunte nada, ya lo encontré 😅

  • @rickytm
    @rickytm2 жыл бұрын

    Tienes planeado hacer algún curso con Identity Server y/o SSO? Saludos desde MTY

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Quizás cuando actualice el de blazor a .NET 7, pero dudo que incluya SSO.

  • @AlfredoLopez-mc8ds
    @AlfredoLopez-mc8ds2 жыл бұрын

    porque no un BulkCopy?

  • @Nico-su1ku
    @Nico-su1ku2 жыл бұрын

    Hola Felipe, buenas tardes, quería saber si con este método se puede enviar una lista de ids para realizar una búsqueda con un procedimiento almacenado. Muchas gracias!

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Buenas, así es, también lo puedes usar para eso

  • @Nico-su1ku

    @Nico-su1ku

    2 жыл бұрын

    @@gavilanch2 Gracias por la respuesta, me queda una duda, ¿De esta forma haría una búsqueda por cada id enviado o realizaría la búsqueda al tener todos los datos? ¿El sp cuántas veces se ejecutaría? Muchas gracias nuevamente!

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    @@Nico-su1ku El SP se ejecutaría una sola vez. Se le pasa el listado completo y hay una única ejecución.

  • @Gilgameshx
    @Gilgameshx2 жыл бұрын

    Muy impresionante ambas comparaciones en especial la del metodo ineficiente, cuantas veces habremos utilizado metodos ineficientes sin darnos cuenta XD, excelente video y explicación como siempre sensei Felipe PD: Tus cursos son extremadamente buenos, tengo 5 de ellos y he aprendido demasiado de ellos, aún continuo esperando el de microservices para ir al siguiente nivel :) saludos

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Gracias! Espero pronto empezar a subir videos de microservicios y publicar un curso en Udemy. Saludos!

  • @Gilgameshx

    @Gilgameshx

    2 жыл бұрын

    @@gavilanch2 Genial, genial! estos temas son parte integral de los desarrolladores junior advanced, me han servido mucho tus cursos con pruebas unitarias e integración y de fijo el de microservicios tambien me servirá mucho, saludos

  • @MiguelAnguloLoria
    @MiguelAnguloLoria2 жыл бұрын

    Puedes subir al repositorio el archivo data.txt, por favor...

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Hay una función que lo genera.

  • @ecanosoft2010
    @ecanosoft20102 жыл бұрын

    pero hace 10 millones de interacciones en 35 seg .... como tan rápido en hacer ese ciclo... porque si lo hago con mysql usando vfp... se demora n

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Toma en cuenta que son registros pequeños (una sola columna) y que la BD está en mi pc (poca latencia). Sin embargo, lo que importa es la comparación entre ambas formas de hacer las cosas.

  • @kelvinfelix4588
    @kelvinfelix45882 жыл бұрын

    Yo quiero aprender a programar como usted.

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Suscríbete al canal!

  • @ralopezn
    @ralopezn Жыл бұрын

    Muy buenas noches, excelente tu video, pero me queda una duda y es que no compartiste el contenido del procedimiento almacenado que es el que inserta todos los datos en la DB. Será posible que puedas compartir este SP, ya sea por acá o en el mismo repositorio ? Gracias😀

  • @jcaique7
    @jcaique72 жыл бұрын

    You can do this directly im SQL Server declare @i int; set @i = 0; while @i >= 1000000 do begin insert into (your table) values (the values); set @i += 1; end

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    I'm not sure you understood the point of the video. If you only speak english, my other channel is gavilanch3 where this video is in english.

  • @LocalGhost_8080
    @LocalGhost_80802 жыл бұрын

    le sabe

  • @zatanlucifer5492
    @zatanlucifer54922 жыл бұрын

    lo más eficiente es hacer un bulk... eso lo único que hace es generar mucho tráfico de red y generar mucho log en la BD... muy mal...

  • @rauluriarte5926
    @rauluriarte59262 жыл бұрын

    Cómo ingresar 10 millones de imágenes con un click ??

  • @christianmagnus1003

    @christianmagnus1003

    2 жыл бұрын

    Seria de forma similar, pero creando una api, dejar de lado los datatable y usar el yield para hacer que un loop se ejecute una vez haga una tarea completa y se vuelve a ejecutar de nuevo solo después de haber terminado la tarea anterior

  • @jesusserratoaguilar7105
    @jesusserratoaguilar71052 жыл бұрын

    Tu no haces videos de league of legends? Tienes la voz idéntica a qwerMiguel xd

  • @gavilanch2

    @gavilanch2

    2 жыл бұрын

    Ni juego lol, lo último que jugué fue Witcher 3 y Watch_Dogs 😅

Келесі