Coste de ejecuciones

From: "Xavier Vidal" <xvpxvp(at)menta(dot)net>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Coste de ejecuciones
Date: 2005-10-12 11:15:16
Message-ID: 20051012111516.FYUU22066.smtp04.retemail.es@pentium4
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Saludos

Estaba probando los tiempos de ejecuciones de sentencias a PostgreSQL y me
he encontrado los siguientes resultados:

Tengo una tabla "tipos_actividades" con 60 registros.

Creo una función en lenguaje SQL así:
CREATE OR REPLACE FUNCTION "public"."actividadessql" () RETURNS
SETOF "public"."tipus_actividades" AS '
SELECT * FROM tipus_activitats;
' LANGUAGE 'sql';

También creo una función en pl/pgsql así:
CREATE OR REPLACE FUNCTION "public"."actividadesplpgsql" () RETURNS
SETOF "public"."tipus_actividades" AS
'
DECLARE
rec tipos_actividades%ROWTYPE;
BEGIN
FOR rec IN SELECT * FROM tipus_actividades ORDER BY idtipo
LOOP
RETURN NEXT rec;
END LOOP;
RETURN;
END
' LANGUAGE 'plpgsql';

Bien, desde PHP creo un bucle que ejecuta 1000 veces la query.

La primera vez, el bucle ejecutó 1000 veces la sentencia escrita
directamente, es decir:
for($i=0; $i<1000; $i++)
{
$resultat = pg_query($connexio,"SELECT * FROM
tipos_actividades");
}

y tardó: 6.4704618454 segundos

Haciendo un explain:
QUERY PLAN
------------------------------------------------------------------
Seq Scan on tipos_actividades (cost=0.00..1.60 rows=60 width=26)
(1 fila)

La segunda vez, el bucle ejecutó 1000 veces la función sql "actividadessql"
con este resultado:
for($i=0; $i<1000; $i++)
{
$resultat = pg_query($connexio,"SELECT * FROM
actividadessql()");
}
tardó: 7.86644506454 segundos
el explain:
QUERY PLAN
-------------------------------------------------------------------
Function Scan on actividadessql (cost=0.00..12.50 rows=1000
width=47)
(1 fila)

*** (aqui es cuando no entiendo lo de rows=1000 ???? ) ****
*** (el coste es de 12.50 frente a 1.60 cuando hacen lo mismo ???)
***

La tercera vez , ejecuto el bucle con la función "actividadesplpgsql"
for($i=0; $i<1000; $i++)
{
$resultat = pg_query($connexio,"SELECT * FROM
actividadesplpgsql()");
}
tardó: 11.9338569641 segundos
el explain:
QUERY PLAN
---------------------------------------------------------------
Function Scan on actividadespgplsql (cost=0.00..12.50 rows=1000
width=47)
(1 fila)

*** (vemos que obtenemos el mismo coste que con la anterior función
)***

Bien, mi pregunta es:

¿No deberían ser más rápidas las funciones definidas en PostgreSQL que las
llamadas directamente desde PHP (o desde donde sea)?
Acaso PostgreSLQ no guarda el plan de ejecución de las funciones internas?

Agradecería vuestra aclaración, gracias.

********************************************************
* XAVIER VIDAL PIERA *
* Enginyer Tècnic en Informàtica de Gestió *
* Tècnic Especialista en Informàtica d'Equips *
* Email: xvpxvp(at)menta(dot)net *
* *
* "A la vida hi ha 10 tipus de persones: *
* els que saben comptar en binari i els que no" *
********************************************************

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2005-10-12 11:30:36 Re: Coste de ejecuciones
Previous Message Pablo Braulio 2005-10-12 09:05:09 Re: password a usuariom