[Pgsql-ayuda] Monitorear un query
Antonio Castro
acastro@ciberdroide.com
Thu, 10 Oct 2002 18:19:00 +0200 (CEST)
On Thu, 10 Oct 2002, Gatosoft wrote:
> Hola Foro...!!!
>=20
> Estoy haciendo una aplicacion cliente en Delphi, que
> toma los datos de un servidor con Postgres 7.1.
> Desde mi aplicacion, le envio al servidor una peticion
> como esta:
>=20
> Select CalcularNomina(...Parametros...)
>=20
> Utilizando los componentes ZEOS.
>=20
> El caso es que este procedimiento actualmente se
> demora entre 2 y 3 minutos, y en el futuro, tal vez se
> demore mas.
> me gustaria saber como puedo saber que est=E0 pasando
> mientras este se ejecuta, algo asi como:
> 10% calculado....
>=20
> cuando lo ejecuto desde la consola, puedo ver esto
> porque utilizo un=20
>=20
> raise notice ''Empleados procesados %'', tantos...=20
>=20
> Se me ocurrio entonces (algo no muy elegante), guardar
> cada vez que procese un empleado, un registro en una
> tabla de Notificaciones que tengo:
>=20
> Perform set_notificacion(''NumPersonas'', valor);
>=20
> y en un proceso paralelo, desde el cliente, voy
> consultando este registro cada cierto tiempo...(!!);
> pero sucede que esto solo se hace efectivo cuando
> termina el procedimiento y el motor hace un COMMIT.
>=20
> Me gustaria saber que se puede hacer, o ustedes como
> trabajan este tipo de problemas...
> ------------------------------------------------
>=20
> Otra inquietud... que naci=F3 de el anterior problema
> es:
> puedo hacer algo como:
>=20
> for RegistroEmpleado into
> {....Query....}
> Loop
> start transaction
>=20
> Aqui hago muchas operaciones=20
> para cada empleado.
>=20
> commit;=20
> end Loop;
>=20
>=20
> Estuve leyendo la documentacion y se que no existe el
> start transaction--Commit, sino: BEGIN; COMMIT;
>=20
> Pero intent=E9 utilizarlo y .... (bueno, ustedes son los
> expertos, ya se imaginaran que pas=F3, o que no pas=F3).
>=20
> Perdonen mi ignorancia, pero soy bastante nuevo en
> Postgres...
Y si haces el tratamiento dividiendolo en varios tramos por fechas por=20
ejemplo ?
Igual las tablas intermedias del gestor resultan mucho m=E1s peque=F1as=20
y el tiempo global se hace menor.
Lo digo porque una query que combine varias tablas con un mont=F3n de
registros cada una suele resultar muy pesado. =20
Lo que te comento ser=EDa un particionado por n=FAmero de registros pero
puedes particionar por tablas. Puedes hacer primero un join entre
unas pocas tablas que genere una tabla temporal y sobre este resultado
le puedes aplicar alguna otra join con la(s) otra(s) tabla(s) restante(s).
Vigila que la cantidad de swap sea suficiente. Si lo ves necesario
puedes aumentar la swap temporalmente y liberarla al final de la query
aunque sea usando swap sobre fichero. Por ejemplo:
=09dd if=3D/dev/zero of=3D/tmp/swap bs=3D1024 count=3D500000
=09chmod 600 /tmp/swap
=09mkswap /tmp/swap
=09swapon /tmp/swap
Te hablo de remedios sencillos porque la optimizacion de una consulta
o la optimizaci=F3n del sistema en general o del gestor de Postgres son
temas que dan para mucho y generalmente requieren saber como funciona
cada cosa lo cual no es facil de resumir en un par de consejos.
Un saludo
Antonio Castro
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--=
+
/\ /\ Ciberdroide Inform=E1tica (Tienda de Linux)
\\W// <<< http://www.ciberdroide.com >>>
=09 _|0 0|_ =20
+-oOOO--(___o___)--OOOo----------------------------------------------------=
+=20
| . . . . U U . . . . Antonio Castro Snurmacher acastro@ciberdroide.com =
| =20
| . . . . . . . . . . =
|=20
+()()()----------()()()----------------------------------------------------=
+
| *** 1.700 sitios clasificados por temas sobre Linux en ***Donde_Linux*** =
|
| <<< http://www.ciberdroide.com/misc/donde/dondelinux.html >>> =
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--=
+