none
Lentitud al presionar el cuarto caracter en textbox en el metodo textchanged c# RRS feed

  • Pregunta

  • Tengo una aplicación en donde estoy realizando una búsqueda de paciente con su historial clínico en base a su apellido y nombre en el método textchanged, el código es el que adjunto a continuación el cual es 100% funcional ya que cumple su labor de búsqueda pero en determinado momento del día se suscita que al digitar el 4 carácter se torna lento y posteriormente aparece después de esa pequeña pausa por decirlo y continua normalmente, cabe añadir que al momento de realizar la carga de mis datos en el método load se cargan aproximadamente 3000 registros, esto también intervendría al momento de realizar la búsqueda?.


    Lo pego como imagen debido a que al momento de poner el código me arroja un error de que los servicios no se encuentran disponibles.

    De antemano agradezco su ayuda.

    sábado, 4 de febrero de 2023 22:22

Respuestas

  • Hola roberto1390,

     

    ¿Alguna noticia sobre su consulta?

     

    ¿La respuesta fue dada por AntiWork?

     

    Gracias por usar los foros de MSDN.

     

    Benjamin G.

    ____________________________

     

    Recuerde "Marcar como respuestas" las respuestas que resolvieron su problema, es una forma común de reconocer a quienes ayudaron y hace que sea más fácil para otros visitantes encontrar la solución más adelante.

    Después de varios días de investigación y pruebas dejo el resultado final.

    El procedimiento con una pagina de 100 resultado al realizar la busqueda.

    ALTER PROCEDURE[dbo].[Buscar_Paciente_Apellido_Historial_Clinico]
      @NUMERO_PAG INT = 1,
            @REGISTRO_PAGINA  INT = 100,
            @NOMPACHISCLI VARCHAR(100)
    AS
    SELECT[HISCLI_COD],[HISCLI_COD_ODONT],O.ODONT_APELLIDO+' '+O.ODONT_NOMBRE AS NOMODONT,P.PAC_APELLIDO+' '+P.PAC_NOMBRE AS NOMPAC
                                    ,[HISCLI_COD_PAC],[HISCLI_MOT_CON]
            FROM TBL_HISTORIA_CLINICA
                                    INNER JOIN TBL_PACIENTE P ON P.PAC_CODIGO = HISCLI_COD_PAC
                                    INNER JOIN TBL_ODONTOLOGO O ON O.ODONT_CODIGO = HISCLI_COD_ODONT
                                    wHERE P.PAC_APELLIDO LIKE '%'+@NOMPACHISCLI+'%' AND HISCLI_EST_ELI != 'F' ORDER BY HISCLI_COD
    								     OFFSET (@NUMERO_PAG-1)*@REGISTRO_PAGINA ROWS
           FETCH NEXT @REGISTRO_PAGINA ROWS ONLY   

    Y segundo y mas importante usando la herramienta de sql en su versión enterprise de optimización de base de datos le hice una verificación al procedimiento sql puesto arriba y me indicaba que debía realizar una indexación de estas columnas, una vez realizada esto, esa demora de segundo quedo en el pasado.

    De antemano agradezco la ayuda de todos.

    • Marcado como respuesta roberto1390 sábado, 18 de febrero de 2023 22:13
    sábado, 18 de febrero de 2023 22:13

Todas las respuestas

  • Es lógico: Cuando igresás el 4to caracter en el txtBusqueda, es cuando txtBusqueda.Text.Length = 3. Ahí se realiza por primera vez la búsqueda. Por lo tanto, hace un filtrado sobre la lista completa. Cuando ingresás el proximo caracter (el 5to) ya el filtro se realiza sobre la lista previamente filtrada, por lo que se supone que debería hacerlo mas rapido.
    domingo, 5 de febrero de 2023 1:17
  • Es lógico: Cuando igresás el 4to caracter en el txtBusqueda, es cuando txtBusqueda.Text.Length = 3. Ahí se realiza por primera vez la búsqueda. Por lo tanto, hace un filtrado sobre la lista completa. Cuando ingresás el proximo caracter (el 5to) ya el filtro se realiza sobre la lista previamente filtrada, por lo que se supone que debería hacerlo mas rapido.
    Efectivamente lo que tu indicas, basándome en tu ejemplo con el cual en un post anterior pude llegar a la solución de una búsqueda mucho mas rápido en tablas con demasiados datos, pero ahora resulta que al digitar el 4to carácter esa pequeña pausa causa un poco de malestar con lo cual tendría que corregir ese pequeño bug por decirlo así. 
    domingo, 5 de febrero de 2023 1:41
  • No se si podrás hacer que tarde menos en la primera carga. Es que la primera vez que filtra hace la consulta a la base de datos, crea los objetos y carga la lista, para los siguiente ya tiene los objetos creados. Por eso se nota la diferencia. A menos, claro, que haya errores u operaciones innecesarias en la consulta o la logica de "Buscar_Paciente_Nombre(txtBusqueda.Text)". Podrías poner el código de esta función? 
    • Editado AntiWork domingo, 5 de febrero de 2023 2:25
    domingo, 5 de febrero de 2023 2:24
  • No se si podrás hacer que tarde menos en la primera carga. Es que la primera vez que filtra hace la consulta a la base de datos, crea los objetos y carga la lista, para los siguiente ya tiene los objetos creados. Por eso se nota la diferencia. A menos, claro, que haya errores u operaciones innecesarias en la consulta o la logica de "Buscar_Paciente_Nombre(txtBusqueda.Text)". Podrías poner el código de esta función

    Este es el código de Buscar_Paciente_Nombre(txtBusqueda.Text) y a continuación el procedimiento el cual mando a llamar a la bd.

    domingo, 5 de febrero de 2023 2:54
  • Lo único que se me ocurre para mejorar el rendimiento es hace una paginación en Datagridview. Esto es ir mostrando una determinada cantidad de datos por página. por ejemplo mostrar 20 filas y cunado el usuario hace clic en "Siguiente", mostrar las siguiente 20.
    domingo, 5 de febrero de 2023 23:56
  • Hola roberto1390,

     

    ¿Alguna noticia sobre su consulta?

     

    ¿La respuesta fue dada por AntiWork?

     

    Gracias por usar los foros de MSDN.

     

    Benjamin G.

    ____________________________

     

    Recuerde "Marcar como respuestas" las respuestas que resolvieron su problema, es una forma común de reconocer a quienes ayudaron y hace que sea más fácil para otros visitantes encontrar la solución más adelante.

    martes, 7 de febrero de 2023 15:22
    Moderador
  • Hola roberto1390,

     

    ¿Alguna noticia sobre su consulta?

     

    ¿La respuesta fue dada por AntiWork?

     

    Gracias por usar los foros de MSDN.

     

    Benjamin G.

    ____________________________

     

    Recuerde "Marcar como respuestas" las respuestas que resolvieron su problema, es una forma común de reconocer a quienes ayudaron y hace que sea más fácil para otros visitantes encontrar la solución más adelante.

    Después de varios días de investigación y pruebas dejo el resultado final.

    El procedimiento con una pagina de 100 resultado al realizar la busqueda.

    ALTER PROCEDURE[dbo].[Buscar_Paciente_Apellido_Historial_Clinico]
      @NUMERO_PAG INT = 1,
            @REGISTRO_PAGINA  INT = 100,
            @NOMPACHISCLI VARCHAR(100)
    AS
    SELECT[HISCLI_COD],[HISCLI_COD_ODONT],O.ODONT_APELLIDO+' '+O.ODONT_NOMBRE AS NOMODONT,P.PAC_APELLIDO+' '+P.PAC_NOMBRE AS NOMPAC
                                    ,[HISCLI_COD_PAC],[HISCLI_MOT_CON]
            FROM TBL_HISTORIA_CLINICA
                                    INNER JOIN TBL_PACIENTE P ON P.PAC_CODIGO = HISCLI_COD_PAC
                                    INNER JOIN TBL_ODONTOLOGO O ON O.ODONT_CODIGO = HISCLI_COD_ODONT
                                    wHERE P.PAC_APELLIDO LIKE '%'+@NOMPACHISCLI+'%' AND HISCLI_EST_ELI != 'F' ORDER BY HISCLI_COD
    								     OFFSET (@NUMERO_PAG-1)*@REGISTRO_PAGINA ROWS
           FETCH NEXT @REGISTRO_PAGINA ROWS ONLY   

    Y segundo y mas importante usando la herramienta de sql en su versión enterprise de optimización de base de datos le hice una verificación al procedimiento sql puesto arriba y me indicaba que debía realizar una indexación de estas columnas, una vez realizada esto, esa demora de segundo quedo en el pasado.

    De antemano agradezco la ayuda de todos.

    • Marcado como respuesta roberto1390 sábado, 18 de febrero de 2023 22:13
    sábado, 18 de febrero de 2023 22:13