none
Consulta lenta a mi base de datos con controlador odbc RRS feed

  • Pregunta

  • Hola tengo una aplicación de escritorio realizada en c# con visual studio. Tengo una base de datos posgresql. Tengo varios pc que acceden a la base de datos mediante conexión lan con un switch cisco sf200-24.

    La aplicación lleva funcionando 2 años, pero ahora estoy teniendo problemas de lentitud en ciertas consultas a la bd desde los ordenadores donde no esta la base de datos instalada. Realizo conexion mediante controlador odbc.

    En la aplicación realizo una consulta sobre una vista que tengo realizada en en posgresql llamada "vista_albaranes". Esta tabla tiene 16 elementos y en la bd tengo 24000 filas.

    En c# realizo la siguiente consulta:

                          



      frmMain.formMain.setStatus("Refrescando información de albaranes...");
                Cursor.Current = Cursors.WaitCursor;
                Application.DoEvents();
    
                this.vista_albaranesTableAdapter.Fill(this.azulejosleyvaDataSet.vista_albaranes);
    
                frmMain.formMain.setStatus("Listo");
                Cursor.Current = Cursors.Default;
                vista_albaranesBindingSource.Position = vista_albaranesBindingSource.Count;
    

    Esta consulta de fill tarda en torno a 3,5 segundo en mostrarme los datos en un datagridview.

    ¿Como puedo acelerar este proceso?

    domingo, 19 de febrero de 2017 13:47

Respuestas

  • Fíjate en que el Fill que haces no tiene ningún filtro, así que se trae todas las 24000 filas al datatable que hay en el tableadapter, y luego las 24000 filas las pasa al BindingSource, lo cual ocasionará que se carguen todas ellas en el control que tengas vinculado al Binding source (típicamente algún tipo de grid).

    Es un volumen excesivo. Aparte del tiempo que se tarde en transferir 24000 filas por la red (3,5 segundos es un tiempo razonable para esto), estos controles no están pensados para manejar esos volúmenes de información. Deberías poner en pantalla algunos filtros para que el usuario pueda escribir sus criterios de búsqueda, y luego hacer un Fill que lleve un WHERE que filtre conforme a esos criterios, de forma que se traiga un número razonable de filas (por ejemplo, no más de 1000). En la consulta puedes poner un "TOP 1000" (o su equivalente en PostgreSql si no soporta el TOP) para que nunca intente traerse más de 1000 filas, y si llega a traer las 1000, mostrarle al usuario un mensaje que diga algo parecido a "Se muestran los primeros 1000 resultados -- refine el filtro si desea ver otros datos".

    domingo, 19 de febrero de 2017 14:20
    Moderador
  • Isidro Buendia,

    Ademas de la recomendación ofrecida, considera utilizar un proveedor de datos ad-hoc para PostgreSql:

    Npgsql - .NET Access to PostgreSQL

    Un proveedor de datos escrito para el marco de trabajo de .NET y específico para un gestor de base de datos será mas eficiente que un proveedor de datos de uso general como ODBC, no digo que está sea la solución a los problemas que tienes porque recuperar 24000 filas tomará tiempo bajo cualquier proveedor, sin embargo un proveedor de datos ad-hoc sobre ODBC ofrece ventajas -incluso- en términos de rendimiento.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 19 de febrero de 2017 17:35

Todas las respuestas

  • Fíjate en que el Fill que haces no tiene ningún filtro, así que se trae todas las 24000 filas al datatable que hay en el tableadapter, y luego las 24000 filas las pasa al BindingSource, lo cual ocasionará que se carguen todas ellas en el control que tengas vinculado al Binding source (típicamente algún tipo de grid).

    Es un volumen excesivo. Aparte del tiempo que se tarde en transferir 24000 filas por la red (3,5 segundos es un tiempo razonable para esto), estos controles no están pensados para manejar esos volúmenes de información. Deberías poner en pantalla algunos filtros para que el usuario pueda escribir sus criterios de búsqueda, y luego hacer un Fill que lleve un WHERE que filtre conforme a esos criterios, de forma que se traiga un número razonable de filas (por ejemplo, no más de 1000). En la consulta puedes poner un "TOP 1000" (o su equivalente en PostgreSql si no soporta el TOP) para que nunca intente traerse más de 1000 filas, y si llega a traer las 1000, mostrarle al usuario un mensaje que diga algo parecido a "Se muestran los primeros 1000 resultados -- refine el filtro si desea ver otros datos".

    domingo, 19 de febrero de 2017 14:20
    Moderador
  • Isidro Buendia,

    Ademas de la recomendación ofrecida, considera utilizar un proveedor de datos ad-hoc para PostgreSql:

    Npgsql - .NET Access to PostgreSQL

    Un proveedor de datos escrito para el marco de trabajo de .NET y específico para un gestor de base de datos será mas eficiente que un proveedor de datos de uso general como ODBC, no digo que está sea la solución a los problemas que tienes porque recuperar 24000 filas tomará tiempo bajo cualquier proveedor, sin embargo un proveedor de datos ad-hoc sobre ODBC ofrece ventajas -incluso- en términos de rendimiento.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 19 de febrero de 2017 17:35
  • Gracias Joyce_AC voy a realizar los cambios que me comentas. Esto es una opción aunque de que forma se podría realizar para que poder hacerlo, es decir yo he visto programa de gestion que muestra todos las factura, con bastantes mas registro y funciona bien.

    Hay alguna de forma de dejar en cada ordenador cliente una copia en memoria de las facturas y actualizarlas en con un boton de actualizar por ejemplo.

     
    miércoles, 22 de febrero de 2017 21:40