Velocidad leyendo datos

24/03/2008 - 19:24 por Eduardo | Informe spam
Hola a todos
Estoy haciendo una prueba con visual studio 2005 y visual studio 2008,
Esta consiste en leer una tabla con 700.000 registros, de la estructura
de la tabla que contiene una cuarenta columnas solo selecciono la 6 que
me interesan
Monto un GridView tanto VS2005 y VS2008 usando el SQLConnection un
Dataset de la Tabla y un DataAdpater todo esto sin escribir una linea
de código, La BD es SQL Server 2005 Standar y la verdad es que tarda en
cargar el DataGrid unos 2 minutos
Hecho esto con otro producto atacando a la misma base de datos y en las
mismas condiciones el llenado del DaTaGrid es practicamente instantaneo
Estoy haciendo algo mal ? o hay algo que me he dejado de hacer pues con
estos tiempos de respuesta me esimposible presentar algo en VS2005 o VS
2008.
Aclaración es trabajando con una aplicacion en Windows
Gracias anticipadas por vuestra ayuda
Eduardo

Eduardo
eduardo@brainland.net

Preguntas similare

Leer las respuestas

#6 Alberto Poblacion
25/03/2008 - 07:55 | Informe spam
"Eduardo" wrote in message
news:
Cuando te refieres a herramientas estandard te refieres solamente a VS2005
o VS2008 o algun complemento,



No, me refería a usar directamente las clases que vienen con el
Framework, sin meter mucho código adicional. Usando software de terceros
probablemente haya grids ya optimizados para este tipo de enlace a datos.

estoy intentando trabajar esta comparacion escribiendo el minimo codigo
posible. la verdad es que el DataReader no lo he sabido encontrar en la
Toolbox si lo tengo que escribir a mano si tengo claro como hacerlo,



No viene en el Tolbox. Hay que escribir un par de líneas de código:
básicamente, crear un Command y llamar a su método ExecuteReader, que te
devuelve el DataReader ya creado y abierto.

lo que no tengo claro es como limitar el numero de registros en el
DataGrid y como montar el Scroll en pantalla para que vaya haciendo



Eso sí que requiere bastante código. Hay que interceptar los eventos del
grid, y construir en ellos las sentencias Sql adecuadas que usen un "Where"
para limitar los registros por el campo o campos que se hayan usado para
ordenar el grid, ejecutarlas, y mantener en memoria algún tipo de "caché"
para darle agilidad al asunto. En cualquier caso, no es una operación
trivial.
En un respuesta anterior, Jesús Lopez ha ofrecido una clase ya preparada
con el código necesario.
Respuesta Responder a este mensaje
#7 Rolando
25/03/2008 - 12:15 | Informe spam
Hola Alberto

Si no tienes más remedio que hacerlo con las herramientas "standard", al
menos usa un DataReader en lugar de un DataSet+DataAdapter, y pasa los
datos directamente del DataReader al GridView. De esta forma, los datos
solo se cargan en memoria una sola vez (dentro del GridView) en lugar de
dos.



Podrias dar mas detalles de como se hace eso para evitar que se carguen dos
veces los datos al GridView?
Es decir como se configura el gridview para evitar eso.


Gracias
Respuesta Responder a este mensaje
#8 Alberto Poblacion
25/03/2008 - 15:59 | Informe spam
"Rolando" wrote in message
news:
Si no tienes más remedio que hacerlo con las herramientas "standard",
al menos usa un DataReader en lugar de un DataSet+DataAdapter, y pasa los
datos directamente del DataReader al GridView. De esta forma, los datos
solo se cargan en memoria una sola vez (dentro del GridView) en lugar de
dos.



Podrias dar mas detalles de como se hace eso para evitar que se carguen
dos veces los datos al GridView?
Es decir como se configura el gridview para evitar eso.



No, no es en el GridView. La primera carga es en el DataSet, que no es
más que un contenedor que recibe en memoria una copia de todos los datos del
servidor. La segunda carga se produce al enlazar el DataSet con el GridView,
ya que el GridView adquiere una segunda copia en memoria de los datos
"absorbiéndolos" del DataSet.
Mi propuesta era la de eliminar por completo el DataSet, y pasar los
datos directamente desde el servidor al GridView, usando para ello el
SqlDataReader, que es un objeto que solo sirve para "bombear" datos desde el
servidor a donde tú le digas (por ejemplo, al GridView), sin quedarse él con
una copia. Esto no se puede hacer desde el diseñador; el DataReader lo
tienes que manejar por código.
Respuesta Responder a este mensaje
#9 Juan Diego Bueno
27/03/2008 - 09:06 | Informe spam
Alberto Poblacion ha utilizado su teclado para escribir :
No, no es en el GridView. La primera carga es en el DataSet, que no es
más que un contenedor que recibe en memoria una copia de todos los datos del
servidor. La segunda carga se produce al enlazar el DataSet con el GridView,
ya que el GridView adquiere una segunda copia en memoria de los datos
"absorbiéndolos" del DataSet.
Mi propuesta era la de eliminar por completo el DataSet, y pasar los
datos directamente desde el servidor al GridView, usando para ello el
SqlDataReader, que es un objeto que solo sirve para "bombear" datos desde el
servidor a donde tú le digas (por ejemplo, al GridView), sin quedarse él con
una copia. Esto no se puede hacer desde el diseñador; el DataReader lo tienes
que manejar por código.



A ver si te he entendido, porque me acabas de descolocar mis esquemas
de repente. Si yo asocio un dataset a un gridview mediante su
datasource, ya sea de forma directa o con un bindingsource, cuando
hablamos de tener dos copias de los datos, ¿te refieres a su propia
presentación en el grid, no?. Quiero decir, si yo tengo un dataset con
100 registros y 20 campos, pero en el grid solo muestro mediante un
filtrado, 10 registros y 4 campos, tengo los datos del dataset en
memoria y los que estoy mostrando en el grid en ese momento. Supongo
que te refieres a eso (he ido pensándolo mientras escribía), porque el
grid apunta al dataset como referencia y quiero creer que no hace una
copia completa, sino de aquello que muestra.

No lo había pensado, y esto para "sólo mostrar datos" puede ser muy
interesante a nivel de consumo de memoria y rendimiento. Para
modificar, podría ser otra cosa, ya que habría que estar mandando
contínuamente commands a la BD, y en el caso que no queramos validar
hasta el final el contenido de ese grid, puede ser un pelín más
complejo de implementar, comparándolo con un gridview asociado a un
dataset y mandando un update a un dataadapter al final para realizar
todos los cambios del tirón en el servidor.

Saludos

http://www.moondance.tk
Respuesta Responder a este mensaje
#10 Alberto Poblacion
27/03/2008 - 09:53 | Informe spam
"Juan Diego Bueno" wrote in message
news:
A ver si te he entendido, porque me acabas de descolocar mis esquemas de
repente. Si yo asocio un dataset a un gridview mediante su datasource, ya
sea de forma directa o con un bindingsource, cuando hablamos de tener dos
copias de los datos, ¿te refieres a su propia presentación en el grid,
no?. Quiero decir, si yo tengo un dataset con 100 registros y 20 campos,
pero en el grid solo muestro mediante un filtrado, 10 registros y 4
campos, tengo los datos del dataset en memoria y los que estoy mostrando
en el grid en ese momento. Supongo que te refieres a eso (he ido
pensándolo mientras escribía), porque el grid apunta al dataset como
referencia y quiero creer que no hace una copia completa, sino de aquello
que muestra.

No lo había pensado, y esto para "sólo mostrar datos" puede ser muy
interesante a nivel de consumo de memoria y rendimiento. Para modificar,
podría ser otra cosa, ya que habría que estar mandando contínuamente
commands a la BD, y en el caso que no queramos validar hasta el final el
contenido de ese grid, puede ser un pelín más complejo de implementar,
comparándolo con un gridview asociado a un dataset y mandando un update a
un dataadapter al final para realizar todos los cambios del tirón en el
servidor.



Creo que tienes razón, y que me he confundido porque he mezclado cosas de
WebForms con las de WinForms. Efectivamente, el grid de WinForms no mantiene
su propia copia de los datos, sino que usa los del datasource vinculado, con
lo que tienes que usar un datasource que contenga datos (tal como el
DataSet) y esta es la única copia que hay en memoria. En cambio, el de Web,
necesita una copia de los datos, por lo que es preferible hacer el
databinding con un DataReader para evitarse la copia adicional. Creo que el
de Windows no admite databinding con el datareader, y que solo se puede
hacer con el de web. Así que pido perdón por la "mezcla" de entornos.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida