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("
")
Do While Rs.Eof=False
Response.Write("
» & Rs(0) & »
«)
Rs.Movenext
Loop
Response.Write(»
")
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
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 😉
GetRows, la solución
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=Nothing
Response.Write("
")
For I=0 To Ubound(Registros,2) 'Inicio del bucle
Response.Write("
» & Registros(0,I) & »
«)
Next
Response.Write("
")
Para contar el número de registros que tiene la variable almacenada debemos utilizar la expresión:
Todos=Ubound(Registros,2)+1
Para trabajar con GetRows, ¿hay que usar números?
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.