¿Cómo RESOLVER el Problema del N+1? Tarde o temprano TE VA A TOCAR 💀

แชร์
ฝัง
  • เผยแพร่เมื่อ 4 ส.ค. 2024
  • El problema de N + 1 es un problema que tarde o temprano te vas a enfrentar como Programador, en este video te daré varias soluciones con sus ventajas y desventajas.
    🍺 Mis Cursos de PROGRAMACIÓN: hdeleon.net/cursos-premium/
    📚 Mis Libros
    📖 Aprender a Programar con C#: hdeleon.net/libro-aprender-a-...
    🤖 Mi Setup
    🖥️ Mi Monitor: amzn.to/3dtnDkk
    ⌨️ Mi Teclado: amzn.to/3BtjKnq
    ⌨️ Mi Deck elgato: amzn.to/3dvEKC3
    🎧 Mis Orejeras: amzn.to/3BwQYm0
    🎤 Mi Micrófono: amzn.to/3qPvFHh
    00:00 Introducción
    00:36 ¿Qué es el problema N + 1?
    01:57 La base de datos
    03:20 Solución clásica
    06:29 INNER JOIN
    08:37 Memoria
    12:03 Forma EXTRA: JSON desde SQL
    Si quieres apoyarme y darme para una cerveza puedes hacerlo por aquí: paypal.me/HectorDeLeonGuevara
    Puedes apoyarme desde 0.5 USD al mes uniéndote como miembro al canal aquí: / @hdeleonnet
    🐦Twitter: / powerhdeleon
    🌎Mi Sitio web: hdeleon.net
    📻Raw Radio en Spotify: open.spotify.com/show/3obLU60...
    #programación #dev #programming

ความคิดเห็น • 92

  • @hdeleonnet
    @hdeleonnet  6 หลายเดือนก่อน +6

    Mis Cursos de Programación: hdeleon.net/cursos-premium/
    Mi Nuevo Libro: hdeleon.net/libro-aprender-a-programar-con-c-hector-de-leon/

    • @oreoslawiet355
      @oreoslawiet355 6 หลายเดือนก่อน

      Cómo puedo conseguir tu libro con un autógrafo?

    • @rafageist
      @rafageist 6 หลายเดือนก่อน

      Y hay mas variantes.... pero depende del problema a resolver

  • @benjaminsepulveda1664
    @benjaminsepulveda1664 6 หลายเดือนก่อน +15

    Excelente video, solo agregar que si quieres ver el rendimiento de las consultar utilizar explain para ver el plan de ejecucion y ver los costes de performance de la query, para los casos donde se necesite performance

  • @keiryliza
    @keiryliza 6 หลายเดือนก่อน +13

    HACK!!!
    Temazo, desde ya esperamos el truco de la carga perezosa.
    ¡Gracias por el contenido, saludos! ❤

  • @christopher8229
    @christopher8229 6 หลายเดือนก่อน +1

    Gran aporte. Muchas gracias

  • @_LeoDev
    @_LeoDev 6 หลายเดือนก่อน +9

    Buena esa la del JSON, no muy común. Ver C# me hizo recordar mis inicios 🥲 Buen contenido 💪

  • @ZohKrahM
    @ZohKrahM 2 หลายเดือนก่อน +1

    La segunda, en lugar de traer todas las cervezas, se podría traerlas filtradas de la base y ya.

  • @pablonardi4416
    @pablonardi4416 6 หลายเดือนก่อน

    Muy buen video. Me encantó. Me sirvió mucho cuando mostraste como hacerlo desde la DB

  • @sentadoensilla
    @sentadoensilla 6 หลายเดือนก่อน +4

    Desde que descubri las funciones json en postgres, uso la tercera forma

  • @danielhernandezmanzano6116
    @danielhernandezmanzano6116 4 หลายเดือนก่อน

    Genial!!, buen video Gracias
    :)

  • @emersson7x
    @emersson7x 6 หลายเดือนก่อน +1

    Interesante... 🤨👌👌👌🧐
    Buen video, gracias por el aporte. 👍

  • @dennmendezdel
    @dennmendezdel 15 วันที่ผ่านมา

    Excelente video.

  • @jonathansantos6000
    @jonathansantos6000 6 หลายเดือนก่อน

    Excelentes soluciones, eres un crack

  • @sarracenogamer7375
    @sarracenogamer7375 6 หลายเดือนก่อน

    Muy bueno el video, me acaba de pasar el problema y tus ejemplos me han venido de maravilla para elegir la solución acertada, esperando el video con el "lazy" :)

  • @juanscasado
    @juanscasado 6 หลายเดือนก่อน

    Gracias!

  • @ivanmr6742
    @ivanmr6742 6 หลายเดือนก่อน +6

    Ese metodo con Json es muy bueno 🤘

  • @Lidamster
    @Lidamster 6 หลายเดือนก่อน +1

    Muy buen aporte esa forma de conseguir el JSON, no la conocía!
    Sin embargo, creo que no es la mejor opcion para la salud de la BD. Para ella es preferible devolver la info desnormalizada y en formato tabla que andar utilizando recursos en generar un JSON

  • @LeonardoVargasL
    @LeonardoVargasL 6 หลายเดือนก่อน

    Muchas gracias! Lo entendí. Tuve está pregunta en una entrevista y no supe cómo responder😢

  • @saulantoniomorquechocela5381
    @saulantoniomorquechocela5381 6 หลายเดือนก่อน

    Los primeros dos los utiliza a pero no sabía que eran algo ya específico, pero el último me voló la cabeza ahora a investigar que tanto le pega al performance

  • @elgertz447
    @elgertz447 6 หลายเดือนก่อน

    Con todo viejo ❤

  • @DestroyWolves
    @DestroyWolves 6 หลายเดือนก่อน +1

    Qué opinas del manejo de datos en tablas verticales, donde cada registro represente un valor de un encabezado relacionado y no una columna como se acostumbra ¿En qué casos es optimo usarlo?

  • @joseangelsanchez5357
    @joseangelsanchez5357 6 หลายเดือนก่อน +1

    Utilizando el .Include() vendría siendo lo mismo que el JOIN, no?
    Saludos, gracias por tu contenido.

  • @nazgulresebo
    @nazgulresebo 6 หลายเดือนก่อน +11

    Lo malo del where/contains es que lo va traducir a un IN en SQL y tiene un límite. Está bien chida la tercera opción jaja

    • @fabioalfonso2144
      @fabioalfonso2144 5 หลายเดือนก่อน

      Hola amigo, a que limite te refieres?, no encontre documentacion sobre el tema, podrias aclararme la duda?

    • @nazgulresebo
      @nazgulresebo 5 หลายเดือนก่อน

      @@fabioalfonso2144 Linq traduce esas expresiones a una consulta SQL. Sería una consulta de este estilo SELECT * FROM TABLE WHERE CAMPO IN ('VALO1', ..., 'VALORN'), pero lo que hay dentro del IN tiene un límite. Esto dice la documentación:
      Explicitly including an extremely large number of values (many thousands of values separated by commas) within the parentheses, in an IN clause can consume resources and return errors 8623 or 8632. To work around this problem, store the items in the IN list in a table, and use a SELECT subquery within an IN clause.

    • @nazgulresebo
      @nazgulresebo 5 หลายเดือนก่อน

      @@fabioalfonso2144 Lo que pasa es que linq traduce ese tipo de expresiones a una consulta de este estilo: SELECT * FROM TABLE WHERE CAMPO IN ('V1', ... , 'VN'). Lo que va dentro del IN tiene un límite. Esto dice la documentación:
      Explicitly including an extremely large number of values (many thousands of values separated by commas) within the parentheses, in an IN clause can consume resources and return errors 8623 or 8632. To work around this problem, store the items in the IN list in a table, and use a SELECT subquery within an IN claus

  • @jesussotillo107
    @jesussotillo107 5 หลายเดือนก่อน

    Hector y meter un .select despues del where para traer la data que necesitas que ventejas o desventajas nos da?

  • @murphishouse
    @murphishouse 6 หลายเดือนก่อน

    Hola Héctor te harías un video de programar y configurara para alta disponibilidad, para muchos usuarios?

  • @midscarlosespinoza
    @midscarlosespinoza 6 หลายเดือนก่อน

    Me gusto la parte de las tripes comillas, esa no me la sabia 😀

  • @odingaming5698
    @odingaming5698 6 หลายเดือนก่อน +1

    El metodo del json no lo conocia, me lo apunto para futuro

  • @Magistrado1914
    @Magistrado1914 5 หลายเดือนก่อน

    Excelente vídeo y contenido.
    Visto en 04/03/2024

  • @juandavidramirezalvarez3807
    @juandavidramirezalvarez3807 6 หลายเดือนก่อน +1

    Gracias por compartir este conocimiento. PDT: Quiero ver la forma perezosa jajaja. Me identifica :/

  • @GermanMacias
    @GermanMacias 6 หลายเดือนก่อน +1

    en java se hace la consulta jpa con join fetch, y la propiedad del objeto se declara como Lazy :P

  • @erimaykenta
    @erimaykenta 6 หลายเดือนก่อน

    Bastante elegante!!

  • @andresleonardo9686
    @andresleonardo9686 6 หลายเดือนก่อน

    Que hay del SelectAll?

  • @geovannimv3854
    @geovannimv3854 6 หลายเดือนก่อน

    Siempre que hay un video nuevo trato de no perdermelo, excelente video. Gracias!!!
    Tienes algún curso de Azure Files, Blobs?
    Saludos!

  • @erickdiaz3553
    @erickdiaz3553 6 หลายเดือนก่อน

    Que opinas de usar un SP para obtener los datos y un DTO para resolver este problema ?

  • @miguelprado9388
    @miguelprado9388 6 หลายเดือนก่อน +2

    aquí iniciamos un nuevo semestre

  • @nazgulresebo
    @nazgulresebo 6 หลายเดือนก่อน +3

    Se ve que conoces mucho de cervezas deberías de abrir un canal al respecto.

  • @EnanoForro
    @EnanoForro 6 หลายเดือนก่อน +3

    No sabia que se podia generar el Json desde SQL.
    A partir de que version esta esa funcionalidad? O siempre se pudo hacer y recien me entero?
    Buen video

    • @danielsanchez928
      @danielsanchez928 6 หลายเดือนก่อน

      Es algo nuevo, pero no se desde que versión. En versiones viejas de SQL Server, se podía devolver un fichero csv

  • @academic3044
    @academic3044 6 หลายเดือนก่อน

    Estimado Hector, mi hermano excelente video. Tengo una pregunta que requiero que me ayudes, re4sulta que tengo una DB que cada año crece en 10 millones de registros en en una cierta tabla de la DB, ya que cada 10 minutos almacena información que se tiene que si o si guardar como histórico. Que solución me aconsejas para evitar que después de varios años las consultas comiencen a ser mas lentas por la abrumadora cantidad de datos? Seria bueno dividirlo varias DB o migrar a un servidor RDS de AWS por ejemplo con mayor capacidad?. Por favor me ayudas con tu experiencia en esto, necesito tomar una decisión sabia.

    • @TheLinkrs
      @TheLinkrs 6 หลายเดือนก่อน

      Para ese caso de uso lo mejor es Sharding

  • @MesacMovies
    @MesacMovies 6 หลายเดือนก่อน

    Lo de JSON es una locura!

  • @acmesoft
    @acmesoft 6 หลายเดือนก่อน

    Yendo un poco más allá del contenido del video que me pareció excelente:
    Hago unas preguntas desde mi ignorancia.
    Usar Queryable no presta ninguna ventaja con el tema del uso de memoria tanto en el servidor SQL y el de backend para este caso? (creería que sí pero como no conozco bien en profundidad no quisiera arriesgar, o sólo dilata el tiempo en cuando se ejecuta la consulta en el servidor de base de datos) (¿este caso que nombré es al que le llamas carga perezosa?)

    • @hdeleonnet
      @hdeleonnet  6 หลายเดือนก่อน +1

      ToList() regresa List, no IQueryable

  • @gabyyhshss
    @gabyyhshss 3 หลายเดือนก่อน

    Hay alguna relaciôn con Lazy Loading y N+1?

  • @matsoft.oficial
    @matsoft.oficial 6 หลายเดือนก่อน

    Gracias Cabezón me has ayudado a resolver un problema de n + 1

  • @JJsCR98
    @JJsCR98 6 หลายเดือนก่อน +7

    Yo para todo eso solo hago SP de lo que ocupo y desde BackEnd solo hago un llamado. Claro siempre full JSON, la mejor opcion es la ultima.

    • @argeliodelarosarodriguez6730
      @argeliodelarosarodriguez6730 6 หลายเดือนก่อน +7

      Eso tiene un costo tremendo en BD, primero tiene que hacer subqueries, luego transformar el resultado en json y de ahí transmitir el json a la aplicación, lo cual implica también costo a nivel de red. Si no se va a usar el resultado como un json en la aplicación, entonces, al llegar el resultado habría que deserializar la data, lo cual implicaría otro costo adicional.

    • @JJsCR98
      @JJsCR98 6 หลายเดือนก่อน

      @@argeliodelarosarodriguez6730 Si puede ser un problema, yo lo que hago son consultas super optimizadas, con campos necesarios solamente, claro que me ayudo con los indices, lo que hago es monitoriar siempre los query ya si veo mal echo no lo hago por SP, si los resultados de las consultas son consistentes lo meto un tabla de cache para evitar consultas innecesarias a la BD, sobre el nivel de red comprimo los datos del JSON antes de enviarlos, es dependiendo de lo que se requiera tiene sus pros y contras se puede usar Protocol Buffers o MessagePack, que son más ligeros en términos de tamaño y más rápidos de serializar/deserializar. Esto es importante que no influya negativamente el performance del sistema. Por lo que es importante realizar pruebas y mediciones para evaluar el impacto de cada cambio en el rendimiento y la eficiencia.

  • @tqmqjym
    @tqmqjym 6 หลายเดือนก่อน

    👍🏼

  • @lucaseto
    @lucaseto หลายเดือนก่อน

    Include???

  • @juan.olivas
    @juan.olivas 6 หลายเดือนก่อน +1

    La del JSON me falta por implementar, ese escenario lo resolvía con el método anterior al json

    • @lhmendoza6083
      @lhmendoza6083 6 หลายเดือนก่อน

      2016 me parece.

    • @juan.olivas
      @juan.olivas 6 หลายเดือนก่อน

      ??@@lhmendoza6083

  • @ez7125
    @ez7125 6 หลายเดือนก่อน

    save

  • @tortorhl
    @tortorhl 6 หลายเดือนก่อน +1

    Te pases de v*rg yo me llamo Héctor León... pense que era el unico.
    Edito: ¡Espero el vídeo de carga perezosa, nuevo sub!

  • @Dan98475
    @Dan98475 6 หลายเดือนก่อน

    Nuevo video pendiente..., 2.1k...

  • @luxdev4719
    @luxdev4719 6 หลายเดือนก่อน +1

    Crear un arreglo de objetos hijos para cada elemento padre, es lo que mas utilizo en mi día a día. Este video es un buen material para aquellos que aun no saben como lidiar con este asunto.

  • @sienfil
    @sienfil 6 หลายเดือนก่อน

    Con la segunda opción le agregas un rompimiento de control y listo, los programadores de los 80's y 90's lo usaban, inician e imprimen la maca, mientras sea igual imprimen las cervezas y solo la vuelven a imprimir la marca cuando cambie. Es como agrupar se usa mucho para informes que tienen que totalizar por algún grupo. como dice Héctor cuando tienes montones de datos y en un servidor remoto viene el problema, otra que yo uso es UNION ALL y uso campos combinados con un identificador que me dirá que es cada uno, por ejemplo un Id, campo clase y un campo ordenador, el Id identifica si es una marca o cerveza, el campo clase irían las marcas y las cervezas y el ordenador, lo va a poner todo en su lugar, para informes complejos como los contables o financieros funcionan ya que la carga queda a cargo del servidor SQL y no de la aplicación, hacer esos cálculos por c# resultaran lentos.

    • @cguimaraenz
      @cguimaraenz 6 หลายเดือนก่อน

      Buenas noches! Creo que te refieres al INNER JOIN, cierto? El problema no está en la presentación de los datos, que como bien dices, se puede formatear a gusto, sino en la carga de información viajando desde el servidor de la DB, ahí es donde se hace costosa la repetición de información. Saludos!

    • @sienfil
      @sienfil 6 หลายเดือนก่อน

      Hola@@cguimaraenz, como alguna vez lo dijo Ector, hay que ver a sql como un lenguaje de programación y no como un lenguaje de consulta, lo cual nos permite jugar con los datos, en el ejemplo lo que planteo es que en una misma columna se almacena las marcas y las cervezas y una columna identificador la cual nos dice que es, marca o cerveza, se imprime uno debajo del otro sin repetir, lo cual nos da mayor velocidad si los datos fuesen mas extensos. para eso sirve UNION o UNION ALL, combina datos.

    • @juliocrey1
      @juliocrey1 6 หลายเดือนก่อน

      @@sienfil Es lo que pensé. Escribí la consulta para pegarla aquí pero no me lo permite TH-cam.
      Hablas de un primer select con inner join entre marcas y cervezas, luego un union con marcas. Queda todo en una sola columna pero al primer select se le puede hardcodear " - " para diferenciar las cervezas de las marcas.
      Y sí, se traen solamente 13 registros en una sola columna, solo lo que se va a mostrar en pantalla.
      Maquina cliente y red no afectadas, servidor haciendo una subquery pero supongo que el Json también lo hace.

  • @cesarolivera117
    @cesarolivera117 6 หลายเดือนก่อน

    Ya llego a 2k likes, haz el video de "Carga perezosa"

  • @rodolfotovartorres
    @rodolfotovartorres 6 หลายเดือนก่อน +1

    que no ibas a actuar como snape para el reboot de harry poter no lo digo yo, lo dijo brais moure , como siempre gracias por compartir tu conocimiento saludos hermoso

    • @hdeleonnet
      @hdeleonnet  6 หลายเดือนก่อน +1

      😂

  • @jose6433
    @jose6433 6 หลายเดือนก่อน

    men, pregunta en serio, con esto puedo ser jefe de proyectos ya?

  • @user-tk6zl5pc3y
    @user-tk6zl5pc3y 6 หลายเดือนก่อน

    Ya quiero ver la forma perezosa

  • @chybeat
    @chybeat 6 หลายเดือนก่อน

    No me gusta la onda "hardmetalera: (y no fué por lo que vine aqui), así que excelente video... un suscriptor más :).. PD: Los unicornios de Colores y las nubes de algodon son lo mio! 🦄🌈

  • @carlossantanagonzalezlopez3270
    @carlossantanagonzalezlopez3270 29 วันที่ผ่านมา

    Algo tan sencillo y que nadie explica

  • @eduardohidalgo2720
    @eduardohidalgo2720 6 หลายเดือนก่อน

    ya vi que en 03:38 pusiste FK no es mejor no usarla?

    • @hdeleonnet
      @hdeleonnet  6 หลายเดือนก่อน +4

      Entonces ve a usar NoSQL

  • @youtekdev8131
    @youtekdev8131 6 หลายเดือนก่อน

    Directo al grano como debe ser.

  • @omarsanchezcuevas8309
    @omarsanchezcuevas8309 6 หลายเดือนก่อน +1

    Hoy me levanté recordándo que hace unos meses estaba sufriendo por esto sin saber que era el famoso n+1
    Tu video me ha sido de mucha ayuda para entder el problema ✌️

  • @user-xs4th5rm6w
    @user-xs4th5rm6w 6 หลายเดือนก่อน

    Jod como sabes que no di like jaja, bueno bueno toma tu like, gracias por tu contenido

  • @andreij2589
    @andreij2589 6 หลายเดือนก่อน +2

    Si HdeLeon es tan bueno porque no hay HdeLeon2?

  • @RickychavezDeveloper
    @RickychavezDeveloper 6 หลายเดือนก่อน

    usted hizo pacto con el chamuco para ser tan pro

  • @cesaresp9585
    @cesaresp9585 6 หลายเดือนก่อน

    Carga Héctorosa

  • @david1791100
    @david1791100 6 หลายเดือนก่อน

    Ya ya ya le di like, mil disculpas 😂

  • @dev_crios
    @dev_crios 6 หลายเดือนก่อน +1

    Ya que últimamente estas tomando vino , por respeto a la cerveza, deberías dejar de usarla en los ejemplos.

  • @elaprendiz7208
    @elaprendiz7208 6 หลายเดือนก่อน

    🤣🤣🤣🤣🤣🤣👋🏼🇩🇴🇮🇹

  • @agustinsimiand400
    @agustinsimiand400 6 หลายเดือนก่อน

    añado un comentrio

  • @Ross96D
    @Ross96D 6 หลายเดือนก่อน

    Y las views?

  • @dragonnegro4413
    @dragonnegro4413 6 หลายเดือนก่อน

    Quejón 😂😂😂

  • @mnlo
    @mnlo 6 หลายเดือนก่อน +1

    me pillaste no le habia dado like aun xD

  •  2 หลายเดือนก่อน

    HAS ECHO LINQ ANIDADO ?

    • @hdeleonnet
      @hdeleonnet  2 หลายเดือนก่อน

      th-cam.com/video/r8Th2EYUVZY/w-d-xo.html