none
mi consulta no soporta grandes cantidades de registros. RRS feed

  • Pregunta

  • Buenos dias

    Programo en vb.net y uso SQL

    tengo un pequeño sistema de ventas y lo estoy probando 

    estoy probando el registro cliente:

    tengo la siguiente consulta: 

        If CboBuscar.Text = "NOMBRE" Then
                    Me.TextBuscar.Clear()
                    Me.TextBuscar.Focus()
                    Consulta = " Select codigo_cliente as Código, nom_cli as Nombre, apell_cli as Apellidos, dir_cli as Dirección,tel_cli as Telefono, bal_cli as Balance from tbla_clientes where nom_cli LIKE '%" + TextBuscar.Text + "%'"
    
    
                    Dim ObjDataSet As New DataSet()
                    Dim Tbla_ClienteMemoria As New DataTable()
    
                    Dim objAdap As New SqlDataAdapter(Consulta, conexion)
    
                    conexion.Close()
                    conexion.Open()
                    objAdap.Fill(Tbla_ClienteMemoria)
                    Me.dgvConsultaCliente.DataSource = Tbla_ClienteMemoria
                    Me.dgvConsultaCliente.Columns("Balance").DefaultCellStyle.Format = "N2"
                    conexion.Close()
                End If
    

    tengo en la tabla cliente 4,200 clientes registrados y la consulta funciona perfecto. 

    pero sigo introduciendo mas registros y cuando llego a 50,000 la consulta se frisa. 

    es decir que mi consulta no soporta grandes cantidades de registro y por ende esta mal. 

    espero en Dios que alguien pueda ayudarme, mi consulta busca por: código, nombre, apellidos,

    Saludos cordiales 

    jueves, 9 de junio de 2016 14:41

Respuestas

  • @EliannyRD

    Pero sigo introduciendo mas registros y cuando llego a 50,000 la consulta se frisa. 
    es decir que mi consulta no soporta grandes cantidades de registro y por ende esta mal.

    Eso es cuando un usuario hace la búsqueda imaginate que mas de tres usuarios estén haciendo lo mismo, yo te recomendaría usar Listas Genericas tiene una mejor rapidez para cargar datos.

    Pero la solución que yo te doy es la siguiente:

    • Crea un ImputBox(En un formulario con un TextBox), en el cual si vas a buscar a los Perez, Mendoza, Vilchez, dependiendo a que nombre o apellido busques, traigas a ese grupo de coincidencias.
    • Crea un formulario donde tengas un DataGridView donde se van a cargar esas coincidencias.
    • Y por ultimo filtra en el mismo DataGridView para tener el dato especifico(cuando digo busca en el DGV me refiero que filtres en el mismo objeto(control) no en la base de datos).

    Eso es lo que yo haría.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    • Editado Pedro Ávila viernes, 10 de junio de 2016 2:48 ...
    • Marcado como respuesta EliannyRD lunes, 13 de junio de 2016 15:34
    viernes, 10 de junio de 2016 2:23
  • Hola

    Formulario que simula un InputBox.

    Búsqueda

     Usa la misma consulta que has estado haciendo LIKE '%' + @Nombre + '%' (En tu consulta solo trae el Id, valor) SELECT Id, Nombre FROM MiTabla ....... 

    Para filtrar en la grilla(DGV) puedes hacer algo como esto:

    Declaras una variable a nivel de formulario por que la vas usar en diferentes eventos

    Dim listDGV As List(Of DGVBusquedaDto)

    Luego vas a tener que enviarle el parámetro con la información que deseas buscar

    Con esto cargastes el formulario Búsqueda
    listDGV = _repositoryProveedor.SelectList(filter.Descripcion)
                        dgvBusqueda.AutoGenerateColumns = false
                        dgvBusqueda.DataSource = listDGV

    Luego filtras en la grilla(DGV) en el evento TextChanged del TextBoxt

    Private Sub txtDescripcion_TextChanged(sender As Object, e As EventArgs)
                Try
                    Dim filtered = (from x in listDGV where (((x.Descripcion IsNot Nothing) AndAlso  (x.Descripcion.StartsWith(txtDescripcion.Text)))) select x).ToList()
                    dgvBusqueda.DataSource = filtered
    
                Catch ex As Exception
                    Lo que desees
    
                End Try
    
            End Sub


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    • Editado Pedro Ávila viernes, 10 de junio de 2016 14:58 ......
    • Marcado como respuesta EliannyRD lunes, 13 de junio de 2016 15:34
    viernes, 10 de junio de 2016 14:47
  • Gracias por contestar

    te voy hacer honesta, el diseño de la ventana de busque tulla se párese a la mia, pero no entiendo mucho la codificación tulla,

    si no es mucha molestia puedes enviarme el diseño del formulario junto con el código fuente a mi correo: eliannymarte112002@gmail.com

    cuando uno nunca ha ella una cosa tiene siempre dificultades al principio. 

    espero que comprendas mi ignorancia. 

    luego en el foro publico los resultados. 

    Gracias............


    • Editado EliannyRD viernes, 10 de junio de 2016 15:56
    • Marcado como respuesta EliannyRD lunes, 13 de junio de 2016 15:34
    viernes, 10 de junio de 2016 15:55

Todas las respuestas

  • EliannyRD,

    ¿En que contexto realizas la búsqueda? ¿Por la pulsación de cada tecla? ¿Luego de haber ingresado un argumento de búsqueda?

    Consideraciones:

    1. No tiene sentido usar un objeto de tipo DataSet, haz uso de un objeto de tipo DataTable.
    2. Las búsquedas por coincidencia siempre van en contra del rendimiento más aún si haces uso del comodín '%' al inicio y fin de la expresión. Prueba colocando el comodín sólo al final de la expresión { LIKE TextBuscar.Text + % }
    3. Si tienes una gran cantidad de datos recomiendo que evites hacer la búsqueda por cada pulsación de tecla.
    4. Utiliza la instrucción Using para definir el ámbito de una conexión, no es correcto que tengas que cerrar y luego abrir una conexión para asegurarte que no tienes una conexión abierta.

    Esperamos tus comentarios


    jueves, 9 de junio de 2016 15:31
  • Gracias por responder Willams Morales

    puedes poner un ejemplo usando la instrucción Using, porfa.....................................

    por Favor..................


    • Editado EliannyRD jueves, 9 de junio de 2016 15:47
    jueves, 9 de junio de 2016 15:46
  • EliannyRD,

    No has dado respuesta a las preguntas que te he formulado. 

    Using cn As New SqlConnection("CADENA_CONEXION")
    	Dim consultaSQL As String = "SELECT * FROM Contratos"
    	
    	Dim adap As New SqlDataAdapter(consultaSQL, cn)
    	Dim dt As New DataTable()
    
    	adap.Fill(dt)
    
    	DataGridView1.DataSource = dt
    End Using
    

    jueves, 9 de junio de 2016 15:51
  • por contexto realizas la búsqueda? ¿Por la pulsación de cada tecla?
    jueves, 9 de junio de 2016 15:52
  • Buenas el codigo me quedó asi: 

    If CboBuscar.Text = "CODIGO" Then
    
                    Using cn As New SqlConnection(cadenaConexion)
                        Dim consultaSQL As String = " Select codigo_cliente as Código, nom_cli as Nombre, apell_cli as Apellidos, dir_cli as Dirección,tel_cli as Telefono, bal_cli as Balance from tbla_clientes where codigo_cliente LIKE '%" + TextBuscar.Text + "%'"
    
                        Dim adap As New SqlDataAdapter(consultaSQL, cn)
                        Dim dt As New DataTable()
    
                        adap.Fill(dt)
    
                        dgvConsultaCliente.DataSource = dt
                    End Using

    pero todavía sigue dando el error, se frisa porque hay muchos registros. 

    jueves, 9 de junio de 2016 16:21
  • Me siento impotente, por favor responde Willams Morales
    jueves, 9 de junio de 2016 19:07
  • EliannyRD,

    No puedo ayudarle si no colabora con las dudas que tengo respecto a su proyecto. Recuerde que yo de su proyecto no se absolutamente nada, no debe de suponer que yo deba imaginar soluciones.

    Una vez mas, ¿la búsqueda se lanza cada vez que el usuario presiona una tecla? o ¿la búsqueda se lanza luego de presionar -por ejemplo- un botón de buscar?

    Ya le comente acerca de los problemas en performance al tener el comodín '%' al inicio de la expresión de búsqueda, ¿ha intentado colocarlo sólo al final?

    Dim consultaSQL As String = " Select codigo_cliente as Código, nom_cli as Nombre, apell_cli as Apellidos, dir_cli as Dirección,tel_cli as Telefono, bal_cli as Balance from tbla_clientes where codigo_cliente LIKE '" + TextBuscar.Text + "%'"

    ¿Ha intentado lanzar la misma consulta desde una ventana de Managment Studio? ¿El tiempo de respuesta también es amplio?

    Por último, aclaré las cosas: ¿se frisa o da error? ¿Debo suponer que frizar es congelar? ¿por cuánto tiempo?

    Le agradeceré responder a las preguntas que le hago y comente acerca de las pruebas que le sugiero


    jueves, 9 de junio de 2016 19:16
  • Gracias  Willams Morales

    la consulta realmente funciona, pero dura aproximadamente en ejecutarse como un Minuto y se pone muy lenta la ventana de Búsqueda. 

    pero cuando son de 2000 hacia abajo la consulta funciona rápida. 

    yo estoy probando la consulta con 62,000 registros, 

    el asunto del comodín '%' ya lo arregle, pero siento que la consulta esta un poco lenta dura aproximadamente casi un minuto en ejecutarse. 

    para menos problemas tengo el código de la consulta dentro de un botón, selecciono los criterios de búsqueda y luego presiono clic al botón buscar. 

    Gracias. 


    jueves, 9 de junio de 2016 23:16
  • EliannyRD,

    Quizá la demora no es por la ejecución de la consulta, sino el traer los datos según la cantidad de filas que devuelva la consulta

    ¿Has echo la prueba de ejecutar la consulta desde una ventana de Managment Studio?

    jueves, 9 de junio de 2016 23:22
  • no se lo que es  una ventana de Managment Studio?

    y que diferencia tiene con un formulario normal (Windows Form)

    jueves, 9 de junio de 2016 23:40
  • @EliannyRD

    Pero sigo introduciendo mas registros y cuando llego a 50,000 la consulta se frisa. 
    es decir que mi consulta no soporta grandes cantidades de registro y por ende esta mal.

    Eso es cuando un usuario hace la búsqueda imaginate que mas de tres usuarios estén haciendo lo mismo, yo te recomendaría usar Listas Genericas tiene una mejor rapidez para cargar datos.

    Pero la solución que yo te doy es la siguiente:

    • Crea un ImputBox(En un formulario con un TextBox), en el cual si vas a buscar a los Perez, Mendoza, Vilchez, dependiendo a que nombre o apellido busques, traigas a ese grupo de coincidencias.
    • Crea un formulario donde tengas un DataGridView donde se van a cargar esas coincidencias.
    • Y por ultimo filtra en el mismo DataGridView para tener el dato especifico(cuando digo busca en el DGV me refiero que filtres en el mismo objeto(control) no en la base de datos).

    Eso es lo que yo haría.


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    • Editado Pedro Ávila viernes, 10 de junio de 2016 2:48 ...
    • Marcado como respuesta EliannyRD lunes, 13 de junio de 2016 15:34
    viernes, 10 de junio de 2016 2:23
  • Gracias por responder

    Ya tengo el formulario y el diseño como dices. pero puedes poner un ejemplo del código de la búsqueda (Consulta). 

    por favor..........................................................................................................................................

    Saludos...


    • Editado EliannyRD viernes, 10 de junio de 2016 14:36
    viernes, 10 de junio de 2016 14:11
  • Hola

    Formulario que simula un InputBox.

    Búsqueda

     Usa la misma consulta que has estado haciendo LIKE '%' + @Nombre + '%' (En tu consulta solo trae el Id, valor) SELECT Id, Nombre FROM MiTabla ....... 

    Para filtrar en la grilla(DGV) puedes hacer algo como esto:

    Declaras una variable a nivel de formulario por que la vas usar en diferentes eventos

    Dim listDGV As List(Of DGVBusquedaDto)

    Luego vas a tener que enviarle el parámetro con la información que deseas buscar

    Con esto cargastes el formulario Búsqueda
    listDGV = _repositoryProveedor.SelectList(filter.Descripcion)
                        dgvBusqueda.AutoGenerateColumns = false
                        dgvBusqueda.DataSource = listDGV

    Luego filtras en la grilla(DGV) en el evento TextChanged del TextBoxt

    Private Sub txtDescripcion_TextChanged(sender As Object, e As EventArgs)
                Try
                    Dim filtered = (from x in listDGV where (((x.Descripcion IsNot Nothing) AndAlso  (x.Descripcion.StartsWith(txtDescripcion.Text)))) select x).ToList()
                    dgvBusqueda.DataSource = filtered
    
                Catch ex As Exception
                    Lo que desees
    
                End Try
    
            End Sub


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú



    • Editado Pedro Ávila viernes, 10 de junio de 2016 14:58 ......
    • Marcado como respuesta EliannyRD lunes, 13 de junio de 2016 15:34
    viernes, 10 de junio de 2016 14:47
  • Gracias por contestar

    te voy hacer honesta, el diseño de la ventana de busque tulla se párese a la mia, pero no entiendo mucho la codificación tulla,

    si no es mucha molestia puedes enviarme el diseño del formulario junto con el código fuente a mi correo: eliannymarte112002@gmail.com

    cuando uno nunca ha ella una cosa tiene siempre dificultades al principio. 

    espero que comprendas mi ignorancia. 

    luego en el foro publico los resultados. 

    Gracias............


    • Editado EliannyRD viernes, 10 de junio de 2016 15:56
    • Marcado como respuesta EliannyRD lunes, 13 de junio de 2016 15:34
    viernes, 10 de junio de 2016 15:55
  • Resuelto 100X%

    Gracias Pedro Ávila y los demás por sus sugerencias. 

    lunes, 13 de junio de 2016 15:34