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

Поделиться
HTML-код
  • Опубликовано: 28 июн 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

Комментарии • 89

  • @hdeleonnet
    @hdeleonnet  5 месяцев назад +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 5 месяцев назад

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

    • @rafageist
      @rafageist 5 месяцев назад

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

  • @benjaminsepulveda1664
    @benjaminsepulveda1664 5 месяцев назад +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 5 месяцев назад +13

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

  • @christopher8229
    @christopher8229 5 месяцев назад +1

    Gran aporte. Muchas gracias

  • @_LeoDev
    @_LeoDev 5 месяцев назад +9

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

  • @sentadoensilla
    @sentadoensilla 5 месяцев назад +4

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

  • @pablonardi4416
    @pablonardi4416 5 месяцев назад

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

  • @danielhernandezmanzano6116
    @danielhernandezmanzano6116 2 месяца назад

    Genial!!, buen video Gracias
    :)

  • @ivanmr6742
    @ivanmr6742 5 месяцев назад +6

    Ese metodo con Json es muy bueno 🤘

  • @emersson7x
    @emersson7x 5 месяцев назад +1

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

  • @jonathansantos6000
    @jonathansantos6000 4 месяца назад

    Excelentes soluciones, eres un crack

  • @juanscasado
    @juanscasado 5 месяцев назад

    Gracias!

  • @geovannimv3854
    @geovannimv3854 5 месяцев назад

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

  • @sarracenogamer7375
    @sarracenogamer7375 4 месяца назад

    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" :)

  • @saulantoniomorquechocela5381
    @saulantoniomorquechocela5381 5 месяцев назад

    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

  • @LeonardoVargasL
    @LeonardoVargasL 5 месяцев назад

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

  • @elgertz447
    @elgertz447 4 месяца назад

    Con todo viejo ❤

  • @DestroyWolves
    @DestroyWolves 5 месяцев назад +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?

  • @ZohKrahM
    @ZohKrahM Месяц назад +1

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

  • @nazgulresebo
    @nazgulresebo 5 месяцев назад +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 4 месяца назад

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

    • @nazgulresebo
      @nazgulresebo 4 месяца назад

      @@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 4 месяца назад

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

  • @Lidamster
    @Lidamster 5 месяцев назад

    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

  • @joseangelsanchez5357
    @joseangelsanchez5357 5 месяцев назад +1

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

  • @midscarlosespinoza
    @midscarlosespinoza 5 месяцев назад

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

  • @murphishouse
    @murphishouse 5 месяцев назад

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

  • @odingaming5698
    @odingaming5698 5 месяцев назад +1

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

  • @Magistrado1914
    @Magistrado1914 3 месяца назад

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

  • @jesussotillo107
    @jesussotillo107 4 месяца назад

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

  • @miguelprado9388
    @miguelprado9388 5 месяцев назад +2

    aquí iniciamos un nuevo semestre

  • @juandavidramirezalvarez3807
    @juandavidramirezalvarez3807 5 месяцев назад +1

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

  • @GermanMacias
    @GermanMacias 5 месяцев назад +1

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

  • @erimaykenta
    @erimaykenta 5 месяцев назад

    Bastante elegante!!

  • @erickdiaz3553
    @erickdiaz3553 5 месяцев назад

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

  • @andresleonardo9686
    @andresleonardo9686 5 месяцев назад

    Que hay del SelectAll?

  • @acmesoft
    @acmesoft 5 месяцев назад

    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  5 месяцев назад +1

      ToList() regresa List, no IQueryable

  • @EnanoForro
    @EnanoForro 5 месяцев назад +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 5 месяцев назад

      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 5 месяцев назад

    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 5 месяцев назад

      Para ese caso de uso lo mejor es Sharding

  • @tqmqjym
    @tqmqjym 5 месяцев назад

    👍🏼

  • @nazgulresebo
    @nazgulresebo 5 месяцев назад +3

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

  • @MesacMovies
    @MesacMovies 5 месяцев назад

    Lo de JSON es una locura!

  • @gabyyhshss
    @gabyyhshss 2 месяца назад

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

  • @ez7125
    @ez7125 5 месяцев назад

    save

  • @sienfil
    @sienfil 5 месяцев назад

    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 5 месяцев назад

      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 5 месяцев назад

      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 5 месяцев назад

      @@sienfil Es lo que pensé. Escribí la consulta para pegarla aquí pero no me lo permite RUclips.
      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.

  • @luxdev4719
    @luxdev4719 5 месяцев назад +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.

  • @matsoft.oficial
    @matsoft.oficial 5 месяцев назад

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

  • @juan.olivas
    @juan.olivas 5 месяцев назад +1

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

  • @JJsCR98
    @JJsCR98 5 месяцев назад +6

    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 5 месяцев назад +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 5 месяцев назад

      @@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.

  • @rodolfotovartorres
    @rodolfotovartorres 5 месяцев назад +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

  • @cesarolivera117
    @cesarolivera117 4 месяца назад

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

  • @tortorhl
    @tortorhl 5 месяцев назад +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 4 месяца назад

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

  • @jose6433
    @jose6433 5 месяцев назад

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

  • @eduardohidalgo2720
    @eduardohidalgo2720 5 месяцев назад

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

    • @hdeleonnet
      @hdeleonnet  5 месяцев назад +4

      Entonces ve a usar NoSQL

  • @user-tk6zl5pc3y
    @user-tk6zl5pc3y 5 месяцев назад

    Ya quiero ver la forma perezosa

  • @chybeat
    @chybeat 5 месяцев назад

    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! 🦄🌈

  • @youtekdev8131
    @youtekdev8131 5 месяцев назад

    Directo al grano como debe ser.

  • @andreij2589
    @andreij2589 5 месяцев назад +2

    Si HdeLeon es tan bueno porque no hay HdeLeon2?

  • @omarsanchezcuevas8309
    @omarsanchezcuevas8309 5 месяцев назад +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 5 месяцев назад

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

  • @elaprendiz7208
    @elaprendiz7208 5 месяцев назад

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

  • @RickychavezDeveloper
    @RickychavezDeveloper 5 месяцев назад

    usted hizo pacto con el chamuco para ser tan pro

  • @agustinsimiand400
    @agustinsimiand400 5 месяцев назад

    añado un comentrio

  • @cesarespinoza9585
    @cesarespinoza9585 5 месяцев назад

    Carga Héctorosa

  • @Ross96D
    @Ross96D 5 месяцев назад

    Y las views?

  • @dev_crios
    @dev_crios 5 месяцев назад +1

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

  • @david1791100
    @david1791100 5 месяцев назад

    Ya ya ya le di like, mil disculpas 😂

  • @dragonnegro4413
    @dragonnegro4413 5 месяцев назад

    Quejón 😂😂😂

  •  Месяц назад

    HAS ECHO LINQ ANIDADO ?

    • @hdeleonnet
      @hdeleonnet  Месяц назад

      ruclips.net/video/r8Th2EYUVZY/видео.html

  • @mnlo
    @mnlo 5 месяцев назад +1

    me pillaste no le habia dado like aun xD