{"id":3002,"date":"2022-01-23T22:54:10","date_gmt":"2022-01-24T01:54:10","guid":{"rendered":"https:\/\/www.geekosas.com\/?p=3002"},"modified":"2026-05-16T16:26:18","modified_gmt":"2026-05-16T14:26:18","slug":"insertar-registros-a-base-de-datos-a-toda-velocidad","status":"publish","type":"post","link":"https:\/\/geekosas.com\/index.php\/es\/2022\/01\/23\/insertar-registros-a-base-de-datos-a-toda-velocidad\/","title":{"rendered":"Insertar registros a Base de Datos a toda Velocidad"},"content":{"rendered":"<p>Las herramientas para ETL son muy pr\u00e1cticas al momento de realizar procesos de transformaci\u00f3n de datos autom\u00e1ticos y recurrentes, estas se caracterizan por realizar tres tareas:<br \/>\n(E) extract: conectarse a una o m\u00e1s fuentes y extraer datos.<br \/>\n(T) Transform: Transformar o manipular los datos<br \/>\n(L) Load: Cargar los datos ya transformados al repositorio final.<\/p>\n<p>De ah\u00ed viene el nombre <strong>ETL<\/strong><\/p>\n<p>En general la \u00faltima etapa (Load), carga los datos a un Data-Lake o un Base de Datos SQL, t\u00edpicamente Microsoft <strong>SQL Server<\/strong>, en esta etapa de carga de datos muchas veces toma tiempo considerable del ETL, debido a que la operaci\u00f3n <strong>insert<\/strong>, la cual inserta filas a una Base de Datos en la base de datos es relativamente lenta.<\/p>\n<p>Por eso es que existe una forma de insertar los datos de manera masiva llamada <strong>Bulk Insert<\/strong>, la cual le permite al servidor SQL leer un archivo de datos e insertarlos directamente en la base de datos.<\/p>\n<p>Hoy vamos a comparar el desempe\u00f1o de estas dos t\u00e9cnicas (Insert y Bulk Insert) escribiendo desde R a SQL, vamos a comparar el tiempo que toma escribir bases de datos o tablas de distintos tama\u00f1os.<\/p>\n<p>El experimento consistir\u00e1 en insertar 3 datasets de 100.000, 1.000.000 y 10.000.000 filas, cada uno con 10 columnas de 20 caracteres aleatorios.<\/p>\n<p>Para realizar estas pruebas usaremos el driver ODBC oficial de Microsoft en linux con el paquete odbc para R, por otro lado, generaremos el archivo CSV de carga para bulk insert con la librer\u00eda data.table, la cual es la m\u00e1s r\u00e1pida que conozco (si saben de otra me dicen). en ambos casos mediremos el tiempo completo de carga, osea desde que se tienen los datos listos hasta que est\u00e1n insertados, consideran el crear y depositar los archivos de datos en el servidor.<\/p>\n<p>La configuraci\u00f3n del sistema es bastante simple: el servidor SQL y R est\u00e1n en el mismo datacenter y la comunicaci\u00f3n para traspasar archivos es por SAMBA (carpeta compartida de windows).<\/p>\n<h3>Bulk Insert VS Insert<\/h3>\n<p>En el eje Y tenemos el tiempo y en el X  el n\u00famero de filas, podemos ver que el insert normal es considerablemente m\u00e1s lento y que no tenemos el dato para 10 millones de filas, esto se debe a que la carga fall\u00f3.<\/p>\n<p><img data-recalc-dims=\"1\" height=\"768\" width=\"1024\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2022\/01\/1-1024x768.png?resize=1024%2C768&#038;ssl=1\" alt=\"\" \/><\/p>\n<p>La diferencia es abismante pero seg\u00fan la documentaci\u00f3n de SQL server, el bulk insert puede funcionar en paralelo, por lo que compararemos las velocidades para 1, 4 y 8  threads<\/p>\n<h3>Inserci\u00f3n en paralelo.<\/h3>\n<p>Quiero destacar que la programaci\u00f3n para logar insertar en paralelo es algo compleja, pero aca van los resultados:<\/p>\n<p><img data-recalc-dims=\"1\" height=\"768\" width=\"1024\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2022\/01\/2-1024x768.png?resize=1024%2C768&#038;ssl=1\" alt=\"\" \/><\/p>\n<p>Podemos ver que para datasets grandes usar 8 threads es conveniente, mientras que para datasets peque\u00f1os puede ser problem\u00e1ticos, esto se debe a que dividir el dataset en y crear los threads toma tiempo (a llamada a bulk insert se hizo en python, por que crear un thread en R toma muchos recursos, para realizar esta interacci\u00f3n entre R y Python se us\u00f3 el paquete rericulate).<\/p>\n<h3>Tipos de Storage<\/h3>\n<p>Por \u00faltimo, hoy en d\u00eda est\u00e1n muy de moda las bases de datos columnares, dise\u00f1adas m\u00e1s para el procesamiento de datos que para ser transaccionales.<\/p>\n<p><img data-recalc-dims=\"1\" height=\"768\" width=\"1024\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2022\/01\/3-1024x768.png?resize=1024%2C768&#038;ssl=1\" alt=\"\" \/><\/p>\n<p>Podemos ver que el columnstore es un poco m\u00e1s r\u00e1pido que el cl\u00e1sico rowstore, esto es relevante porque el m\u00e1ximo beneficio del columnstore viene en la extracci\u00f3n de datos m\u00e1s que en la inserci\u00f3n, por lo que es completamente recomendable.<\/p>\n<h3>Conclusiones<\/h3>\n<p>Bulk Insert es aproximadamente 10 veces m\u00e1s r\u00e1pido para insertar datos en una base datos<\/p>\n<p>La inserci\u00f3n en paralelo tiene beneficios significativos, pero la programaci\u00f3n es compleja, si alguien quiere guia, que no dude en contactarme.<\/p>\n<p>Por \u00faltimo, el columnstore tiene algo de impacto positivo, pero es recomendado por que mejora la velocidad de lectura y es f\u00e1cil de configurar.<\/p>\n<p>Por ultimo: esta vez no comparto los c\u00f3digos por que los desarrolle para el ambiente anal\u00edtico de Anasac donde trabajo actualmente, por lo que no son gen\u00e9ricos, pero si alguien requiere ayuda, que no dude en contactarme.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Las herramientas para ETL son muy pr\u00e1cticas al momento de realizar procesos de transformaci\u00f3n de datos autom\u00e1ticos y recurrentes, estas se caracterizan por realizar tres <a class=\"mh-excerpt-more\" href=\"https:\/\/geekosas.com\/index.php\/es\/2022\/01\/23\/insertar-registros-a-base-de-datos-a-toda-velocidad\/\" title=\"Insertar registros a Base de Datos a toda Velocidad\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":3082,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[13],"tags":[],"class_list":["post-3002","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized-es"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2021\/09\/patch.png?fit=728%2C380&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8vjqF-Mq","jetpack-related-posts":[{"id":2560,"url":"https:\/\/geekosas.com\/index.php\/es\/2018\/08\/18\/escribir-en-redshift-desde-r-a-toda-velocidad\/","url_meta":{"origin":3002,"position":0},"title":"Escribir en Redshift desde R a toda velocidad","author":"Daniel Fischer","date":"2018-08-18","format":false,"excerpt":"Como muchos saben, Redshift es un fork de Postgres hecho por Amazon para entregar un servicio de Data Warehouse, la gran diferencia entre estos 2 productos es que el primero es una base de datos columnar y comprimida, mientras que el segundo no. Las bases de datos columnares son muy\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/RtoRedshift.png?fit=600%2C300&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/RtoRedshift.png?fit=600%2C300&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/RtoRedshift.png?fit=600%2C300&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3115,"url":"https:\/\/geekosas.com\/index.php\/es\/2022\/05\/07\/buenas-practicas-al-programar-con-codigo\/","url_meta":{"origin":3002,"position":1},"title":"Buenas pr\u00e1cticas al programar (con c\u00f3digo)","author":"Daniel Fischer","date":"2022-05-07","format":false,"excerpt":"Muchos disfrutan programar y resolver laberintos algor\u00edtmicos en su lenguaje favorito, pero lo que a nadie le gusta, es meterse en un c\u00f3digo viejo o incluso peor, en un c\u00f3digo escrito por otro. A m\u00ed me ha tocado hacerlo ya varias veces, algunas veces ha sido malo, otras veces peor,\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":2771,"url":"https:\/\/geekosas.com\/index.php\/es\/2020\/04\/07\/comparativa-entre-julia-python-y-r\/","url_meta":{"origin":3002,"position":2},"title":"Comparativa entre Julia, Python y R","author":"Daniel Fischer","date":"2020-04-07","format":false,"excerpt":"La discusi\u00f3n sobre que lenguaje es el mejor para analizar datos puede llevarnos a conversaciones mas apasionadas que por temas como religi\u00f3n o pol\u00edtica. Pero como Data-Scientist debemos enfocarnos en la evidencia emp\u00edrica, las dimensiones con las que se podr\u00edan comparar son muchas: Comunidad, Performance, Editores, Gestor de Paquetes, Encapsulaci\u00f3n\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/external-content.duckduckgo.com_.jpg?fit=474%2C312&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2269,"url":"https:\/\/geekosas.com\/index.php\/es\/2017\/12\/18\/estimacion-repartija-de-votos-segunda-vuelta-presidenciales-chile-2017\/","url_meta":{"origin":3002,"position":3},"title":"Estimaci\u00f3n repartija de votos segunda vuelta presidenciales Chile 2017","author":"Daniel Fischer","date":"2017-12-18","format":false,"excerpt":"Este Articulo fu\u00e9 hecho apurado y con pocos datos, el definitivo est\u00e1 en\u00a0Quien vot\u00f3 por cada Candidato? Despu\u00e9s de la primera vuelta de las elecciones presidenciales de Chile, es tradicional que cada uno de los candidatos comienza a \"rematar\" los votos de sus seguidores a aquel candidato con el que\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":2064,"url":"https:\/\/geekosas.com\/index.php\/es\/2017\/04\/23\/peliculas-2016\/","url_meta":{"origin":3002,"position":4},"title":"Pel\u00edculas 2016","author":"Daniel Fischer","date":"2017-04-23","format":false,"excerpt":"Las pel\u00edculas nos hacen re\u00edr, llorar y algunas... dormir, por lo que decid\u00ed realizar un peque\u00f1o an\u00e1lisis sobre las pel\u00edculas del 2016 Al igual que con V\u00eddeo Juegos y Data Science, hicimos un web scraping del sitio\u00a0www.metacritic.com\u00a0para generar una base de datos, en la cual, para cada pel\u00edcula obtuvimos la\u2026","rel":"","context":"In &quot;Uncategorized&quot;","block_context":{"text":"Uncategorized","link":"https:\/\/geekosas.com\/index.php\/es\/category\/uncategorized-es\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/03\/histogramas-300x120.png?resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/03\/histogramas-300x120.png?resize=350%2C200 1x, https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/03\/histogramas-300x120.png?resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2017\/03\/histogramas-300x120.png?resize=700%2C400 2x"},"classes":[]},{"id":828,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/05\/08\/k-means\/","url_meta":{"origin":3002,"position":5},"title":"Segmentar clientes paso a paso","author":"Daniel Fischer","date":"2016-05-08","format":false,"excerpt":"Anteriormente escrib\u00ed sobre las redes neuronales (click aca para verlo).\u00a0Las redes neuronales y todos los otros \"m\u00e9todos supervisados\" son utilizados cuando\u00a0posee una muestra de valores\u00a0predecir, pero cuando sabes lo que quieres\u00a0lograr, pero no tienes una muestra del valor a predecir, se utilizan los llamados \"m\u00e9todos no supervisados\" Un cl\u00e1sico problema\u2026","rel":"","context":"In &quot;Uncategorized&quot;","block_context":{"text":"Uncategorized","link":"https:\/\/geekosas.com\/index.php\/es\/category\/uncategorized-es\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/05\/kmenas6.png?fit=620%2C539&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/05\/kmenas6.png?fit=620%2C539&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/05\/kmenas6.png?fit=620%2C539&ssl=1&resize=525%2C300 1.5x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3002","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/comments?post=3002"}],"version-history":[{"count":5,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3002\/revisions"}],"predecessor-version":[{"id":3225,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/3002\/revisions\/3225"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media\/3082"}],"wp:attachment":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media?parent=3002"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/categories?post=3002"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/tags?post=3002"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}