[perl] Performance en Perl y IIS
Bolo Lacertus
lacertus@servidor.unam.mx
Wed, 20 Sep 2000 13:24:14 -0500
Saludos!!!
Ah!, justamente a lo que me refería.
Gabriela Bouret wrote:
> $dbh = DBI->connect($odbc, $us, $ps);
> my($sth) = $dbh->prepare("select campo1,campo2 from tabla1");
Tu select no tiene joins, es decir, todos los renglones estan en una
sola tabla, lo que ayuda muchisimo a que la base de datos no tenga que
procesar grandes conjuntos cartesianos y por lo tanto, ya está todo lo
rápido que puede estar.
Como los CGI's estricatamente hablando, no tienen estado entre
operaciones, no puedes mantener la operación entre diversas páginas para
hacer un solo select (bueno, si usas mod_perl si podrías, pero esa es
otra historia), lo que si puedes hacer, es el evitar el tener que
recuperar todos los registros anteriores al que deseas.
Los cursores son una característica de las bases de datos mas poderosas
que permiten manejar los resultados de un query renglón por renglón, el
pbjetivo de usarlos sería el evitar la transferencia de hasta 2970
registros que no vas a usar y pedirle a tu DBMS que solo te de los
registros que deseas. Sin embargo, los cursores son implementados de
modo diferente por cada base de datos y no conozco el modo en que SQL
Server de Microsoft lo haga (?Te sirve en Postgres?). En fin, es cosa de
hecharse un clavado en los manuales de SQL Server.
(Encontre algunas referencias en:
http://www.microsoft.com/Mind/0399/sql/sql.htm (Navigating a Table)
http://www.microsoft.com/Mind/1198/ado/ado.htm (punto numero 4)
)
Otra cosa que puede ayudar (pero no tanto) es optmizar el proceso de
recuperación de registros. Dice en la documentación que es mas eficiente
si usas "bindparam" y fetchrow_arrayref, aunque la utilidad de optimizar
el tiempo al recuperar un registro es mayor cuando recuperas una gran
cantidad de ellos (justo lo que tenemos que evitar).
Por lo que pueda ayudar, para hacerlo así tenemos que poner:
$rv = $sth->bind_columns(undef, \$var1, \$var2);
#entre el prepare y el execute
> $sth->execute();
> while ($sth->fetch())
>
En este codigo solo usamos $var1 y $var2 sin preocuparnos de otra cosa
(me da la impresión de que ya lo hacías ya que no usaste
fetchrow_arrayref)
> ### más líneas de código que procesan los datos
> ...
> }
> $sth->finish;
> $dbh->disconnect();
Como al parecer ya estabas usando bind para recuperar tus valores, no
creo que el mejorar el mecanismo de recuperación de registros sea de
gran ayuda, sin embargo, el recuperar solo los registros que necesitas
vale la pena el esfuerzo de usar cursores o incluso procedimientos
almacenados (a los que les puedas inficar de cual a cual registro deseas
los resultados) ya que de los pasos mas tardados de una operación SQL es
la copia de los registros del DBMS a las aplicaciones.
Complementando la sugerencia: Daniel Sol
--
Bolo Lacertus: lacertus@servidor.dgsca.unam.mx ==~\___\
http://proteo.dgsca.unam.mx/cgi-bin/lacertus/hola =__vvvv
--------- Pie de mensaje --------------------------------
Visite: http://tlali.iztacala.unam.mx/~randrade/perl.shtml
Cancelar inscripcion:
mail to: majordomo@tlali.iztacala.unam.mx
text : unsubscribe perl