Top 5 ASPCategoríasBuscador
|
Su dominio en 24 horas |
|||||||||||||||||||||||||||
Estás en ASP |
Fecha: 11/04/2007 |
En ASP cuando un Webmaster programa con Bases de datos suele utilizar bucles Do While para recorrer el RecordSet, este sistema no está mal enfocado, pero si disponemos de un servidor con una memoria Ram medianamente potente, podemos optimizar el proceso mucho más.
Vamos a ver como sería el código que casi todo mortal utilizaría para hacer un bucle mostrando una serie de registros:
Dim DB, RS, SQL
SQL="Select * From Tabla"
Set DB=Server.CreateObject("ADODB.Connection")
DB.Open
Set RS=DB.Execute(SQL)
Response.Write("<div>")
Do While Rs.Eof=False
Response.Write("<p>" & Rs(0) & "</p>")
Rs.Movenext
Loop
Response.Write("</div>")
Rs.Close
Supongo que este código le será familiar a más de uno, el único problema es que no es lo bastante rápido como para una Web que tenga que soportar
una gran carga, ¿porqué?, muy sencillo.
El RecordSet cada vez que hace una vuelta en el bucle realiza una petición a la base de datos, esta tiene que responder y lo único que provocamos es un colapso. Pero lo más grabe no es que realice esa petición, sino que cada una de las peticiones solicita el TOTAL de los registros, esto significa que si la consulta extrae 100 registros estará recogiendo la información de esos 100 registros cada vez que compruebe si Eof=False...
Demasiado trabajo para el servidor, ¿verdad?. Por suerte tenemos una alternativa que sobrecargará la memoria pero desahogará al servidor de tantas peticiones, como ya he comentado antes, este método es recomendable tan solo si la memoria de nuestro servidor es medianamente potente y amplia, no lo intentes con una página de alto tráfico que esté alojada en un servidor de 512Mb de RAM, bueno, inténtalo y nos lo cuentas ;)
Todo problema tiene su solución, y la nuestra pasa por hacer más de 1000 consultas a realizar tan solo 1. Este función devuelve los registros resultantes de una consulta a un vector bidimensional, permitiéndonos tratar los datos en una matriz de manera mucho más rápida. La manera de ejecutarlo sería:
Dim Registros
Registros = Rs.GetRows
Una vez pasados los datos a la variable, podemos cerrar o destruir el objeto Recordset, ya que este no volverá a actuar más. Este método es muy aconsejable para bases de datos Access que no soportan muy bien la carga de usuarios.
El vector creado, tiene dos dimensiones, la primera de ella correspondería al campo (como el Rs.Field) y la segunda al contenido del registro. Por lo tanto si quisiéramos hacer la llamada al primer registro del primer campo la instrucción a utilizar sería esta:
Response.Write(Registros(0,0))
Esta instrucción nos devolvería el primer campo (0) de la primera fila (0). Ahora vamos a ver como quedaría el bucle anterior utilizando GetRows:
Dim DB, RS, SQL, Registros
SQL="Select * From Tabla"
Set DB=Server.CreateObject("ADODB.Connection")
DB.Open
Set RS=DB.Execute(SQL)
Registros=Rs.GetRows
Rs.Close
Set Rs=Nothing
Db.Close
Set DB=NothingResponse.Write("<div>")
For I=0 To Ubound(Registros,2) 'Inicio del bucle Response.Write("<p>" & Registros(0,I) & "</p>")
NextResponse.Write("</div>")
Para contar el número de registros que tiene la variable almacenada debemos utilizar la expresión:
Todos=Ubound(Registros,2)+1
Pues no necesariamente, podemos referenciar los campos con variables, por ejemplo, si conocemos de antemano como se llamarán los campos podríamos utilizar el siguiente código:
Dim Nombre, Apellidos
Nombre=0
Apellidos=1
Response.Write(Registros(Nombre,0)) 'Imprimiría la primera fila del campo "Nombre"
Response.Write(Registros(Apellidos,0)) 'Imprimiría la primera fila del campo "Apellidos"
Es una manera rápida de asimilar mejor el código.
Esperamos que este artículo os haya abierto los ojos y tengáis una posibilidad de hacer vuestras aplicaciones más rápidas, en futuros artículos os explicaremos otras funciones que son todavía más rápidas y mejor optimizadas.
|
| Lecturas: 2572 |
Fecha: 01/05/2007 |
|
| Hay diferentes maneras de unir datos extraidos de una tabla, la más común es hacerlo una vez estos datos están fuera, pero se puede realizar una consulta con los datos ya concatenados. | |
| Comentarios de los Usuarios (3) |
Cesar escribió: |
Fecha: 04/06/2007 17:43:10 |
consultasi otro usuario ingresa más registros a la tabla despues de haber ejecutado el getrows , mi matriz se actulizara con esos registros | |
Brian escribió: |
Fecha: 04/06/2007 17:48:29 |
bueno, no es del todo asíHola, Una vez ejecutas la instrucción getrows, se pasan todos los datos a la matriz. Esta se carga con la información vigente cuando tu hiciste el traspaso. Pero si quieres que se vuelvan a cargar los datos deberías de volver a ejecutar la instrucción. Cuando tu ejecutas una Web, esta hace una pasada del código, se muestra al usuario, y se queda en espera hasta que otro usuario vuelve a hacer otro "click". Espero que me hayas entendido. 1 Saludo! | |
Latez escribió: |
Fecha: 26/09/2007 15:51:29 |
Si que ha cambiado el rendimiento de mi foroLa verdad es que se ha notado y mucho el renidmiento del foro. Ahora comenzaba a estar un poco ahogado por la crecida de usuarios y realmente con este sistema se ha solventado. También digo que si no fuese porque el servidor tiene mucha RAM creo que no lo soportaría... | |
Este artículo ya ha superado la fecha máxima para escribir comentarios, 1 año.