none
Mejorar tiempos de carga autocompletar RRS feed

  • Pregunta

  • Me gustaría saber si conocen alguna forma de mejorar esta consulta para usar un autocompletar, la tabla en cuestión tiene registrado unos mil artículos, esta tarda un minutos con nueve segundo para terminar la consultar y llenar el autocomplete.

    es bueno resaltar que tengo otros textbox con el autocompletar por ejemplo con 77 registro y los hace casi de forma automatica.

    'Llena un texbox con opciones de autocompletar'
        Sub autoCompletarTexboxArticulos(ByVal campoTexto3 As TextBox)
            Try
                enunciado3 = New SqlCommand("select DEOR_descripcionarticulo from DETALLE_ORDEN", con)
                respuesta3 = enunciado3.ExecuteReader()
                While respuesta3.Read
                    campoTexto3.AutoCompleteCustomSource.Add(respuesta3.Item("DEOR_descripcionarticulo"))
                End While
                respuesta3.Close()
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
        End Sub



    Arismendy Rodríguez

    lunes, 5 de marzo de 2018 19:53

Respuestas

  • Es casi idéntico a lo que tienes, pero cambiando el objeto por un list:

                enunciado3 = New SqlCommand("select DEOR_descripcionarticulo from DETALLE_ORDEN", con)
                respuesta3 = enunciado3.ExecuteReader()
                Dim lista as New List(Of String)
                While respuesta3.Read
                    lista.Add(respuesta3.GetString(0))
                End While
                respuesta3.Close()
    

    Te he sustituido la lectura del reader por la versión optimizada, pero en realidad eso es completamente independiente del hecho de que cargues una lista o cargues el AutoCompleteCustomSource.

    Después de eso ya tendrías que pasar la lista al AutoCompleteCustomSource y esa es la parte que te digo que tendrías que investigar a ver si tiene alguna opción para cargar todos los datos de golpe sin usar un bucle. Pero antes de hacerlo, verifica con el debugger el tiempo que tarda en cargar la lista como te indico arriba, para validar que efectivamente es rápido y por tanto que el cuello de botella no estaba en el acceso a la base de datos.

    lunes, 5 de marzo de 2018 22:19

Todas las respuestas

  • Un minuto y pico es muchísimo tiempo para una tabla con mil registros. Debería leerla en una fracción de segundo. Tiene que haber alguna otra cosa que no es evidente a la vista de ese pequeño fragmento de código y que te está retrasando. Por ejemplo, podría ser que sea el Add sobre AutoCompleteCustomSource, que internamente esté realizando algún tipo de operación por cada registro que añades, y que se vaya volviendo más y más lento por cada registro adicional.

    Haz la prueba de traer los registros a un List en lugar de al AutoCompleteCustomSource, y verifica el tiempo que tarda esa lectura. Debería ser unas pocas milésimas de segundo si el servidor es local y está bien dimensionado. Por cierto, puedes optimizarlo ligeramente poniendo respuesta.GetString(0) en lugar de respuesta.Item("DEOR_descripcionarticulo").

    Y una vez que lo tengas en el List, mira qué formas hay de pasárselo al AutoCompleteCustomSource. Es posible que tenga algún constructor o alguna sobrecarga que permita pasarle la lista de golpe, en lugar de hacer mil iteraciones pasándole los elementos uno por uno. Si es así, deberías ganar muchísimo en velocidad usando ese método.

    lunes, 5 de marzo de 2018 20:41
  • Saludos, disculpa la ignoracia, como puedo hacerlo con list, no he trabajado mucho de esa forma

    Arismendy Rodríguez

    lunes, 5 de marzo de 2018 21:36
  • Es casi idéntico a lo que tienes, pero cambiando el objeto por un list:

                enunciado3 = New SqlCommand("select DEOR_descripcionarticulo from DETALLE_ORDEN", con)
                respuesta3 = enunciado3.ExecuteReader()
                Dim lista as New List(Of String)
                While respuesta3.Read
                    lista.Add(respuesta3.GetString(0))
                End While
                respuesta3.Close()
    

    Te he sustituido la lectura del reader por la versión optimizada, pero en realidad eso es completamente independiente del hecho de que cargues una lista o cargues el AutoCompleteCustomSource.

    Después de eso ya tendrías que pasar la lista al AutoCompleteCustomSource y esa es la parte que te digo que tendrías que investigar a ver si tiene alguna opción para cargar todos los datos de golpe sin usar un bucle. Pero antes de hacerlo, verifica con el debugger el tiempo que tarda en cargar la lista como te indico arriba, para validar que efectivamente es rápido y por tanto que el cuello de botella no estaba en el acceso a la base de datos.

    lunes, 5 de marzo de 2018 22:19
  • Saludos lo cambiado con el codigo planteado por Leandro en el siguinte enlace: http://ltuttini.blogspot.com.ar/2009/09/c-autocomplete-combobox-o-textbox.html Y ahora si funcioan como debe, Gracias por la respuesta.

    Arismendy Rodríguez

    martes, 6 de marzo de 2018 12:32