PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 20/04/2010 11:54:30

R.Seif
Membre

Appel de deux fonctions ou jointure??

Bonjour,

Je me demandais c koi la solution la plus optimale?
est ce d'opter à chaque fois à l'appel de deux fonctions chacune scanne une table et rende un résultalt, ou bien faire une jointure entre les deux table avec toutes les conditions et rendre un seul résultat????

Hors ligne

#2 20/04/2010 14:24:03

gleu
Administrateur

Re : Appel de deux fonctions ou jointure??

Je ne vois pas ce qu'on peut répondre d'autres que : ça dépend. Avec un peu plus de détails, il serait plus facile d'émettre un avis éclairé. À priori, utiliser des fonctions n'est pas un gain de perfs... mais bon, tout dépend du cas.


Guillaume.

Hors ligne

#3 20/04/2010 15:36:06

R.Seif
Membre

Re : Appel de deux fonctions ou jointure??

create OR replace FUNCTION mape_get_ip(inet) RETURNS integer
AS $$
	DECLARE
	addr ALIAS for $1;
	ipid  integer;
BEGIN
	select into ipid ip from ips where ips.ip= addr;
return ipid;
end;$$
	LANGUAGE plpgsql;

--------------------------------------------------------------------------------------
create OR replace FUNCTION mape_get_peer(inet,integer) RETURNS integer
AS $$
	DECLARE
        addr ALIAS FOR $1;
        port ALIAS FOR $2;
        ipid integer;
        peerid integer;

BEGIN
	-- Get the ID corresponding to the address
	select into ipid mape_get_ip(addr);

	IF ipid >= 1
	then
		select into peerid id FROM peers WHERE peers.ip = addr AND peers.port = port;
		return peerid;
	else
		return 0;
	end IF;

end;$$
	LANGUAGE plpgsql;
----------------------------------------------------------------------------------------

select into peerid mape_get_peer(p_addr,p_port);

ou bien

create or replace FUNCTION mape_get_peer(inet,integer) RETURNS integer
AS $$
	DECLARE
        addr ALIAS for $1;
        port ALIAS for $2;
        --ipid integer;
        peerid integer;

BEGIN	
	select into peerid id from peers, ips
		where peers.ip = ips.ip and peers.id = ips.id and peers.ip = addr and peers.port = port;

	if peerid > 0		
		return peerid;
	else
		return 0;
	end IF;

end;$$
	LANGUAGE plpgsql;

Hors ligne

#4 20/04/2010 15:46:49

gleu
Administrateur

Re : Appel de deux fonctions ou jointure??

Très clairement la jointure sera gagnante.


Guillaume.

Hors ligne

#5 20/04/2010 15:49:48

R.Seif
Membre

Re : Appel de deux fonctions ou jointure??

Merci

Hors ligne

Pied de page des forums