combination of function to simple query makes query slow - Mailing list pgsql-sql
| From | jan aerts (RI) |
|---|---|
| Subject | combination of function to simple query makes query slow |
| Date | |
| Msg-id | 84DA9D8AC9B05F4B889E7C70238CB45101FD6555@rie2ksrv1.ri.bbsrc.ac.uk Whole thread Raw |
| Responses |
Re: combination of function to simple query makes query slow
|
| List | pgsql-sql |
Hi,
I'm having some problems in combining a function within a standard
query.
I basically have two tables (see between hashes below):
* alias_table: objects can have different names (e.g. name1 is an alias
of name2, and name3 is an alias of name4)
* mapping_table: shows objects that 'lead to' other objects (e.g. the
object with name1 leads to the object with name5)
I want to traverse the mapping_table in a transparent way: if a first
object leads to a second object, and that second object leads to a third
object, I want to list the first and the third objects. So from the
example table below: name6 leads to name2, which is an alias of name1,
which in its turn leads to name5. The result of my query should be:
name6 leads to name5.
To accomplish this, I wrote a little function ('aliases_of'), as
described below between the hashes.
The query SELECT aliases_of(1);
returns: aliases_of ---------- 1 2
, which is the expected output.
The query SELECT * FROM mapping_table WHERE object1_id IN ( SELECT aliases_of(2) );
returns: object1_id | object1_name | object2_id | object2_name ----------------------------------------------------- 1
| name1 | 5 | name5
, which is the expected output, because it is equivalent to: SELECT * FROM mapping_table WHERE object1_id IN ( 1, 2 );
However, the query that would traverse the data: SELECT m1.object1_id, m1.object1_name, m2.object2_id, m2.object2_name
FROMmapping_table m1, mapping_table m2 WHERE m1.object2_id IN ( SELECT aliases_of(m2.object1_id) );
just keeps on running, and never seems to stop. (I must say that that
table in effect contains about a million records.)
The expected output would have been: object1_id | object1_name | object2_id | object2_name
-----------------------------------------------------6 | name6 | 5 | name5
I also tried to following, which doesn't work either. SELECT m1.object1_id, m1.object1_name, m2.object2_id,
m2.object2_nameFROM mapping_table m1 JOIN mapping_table m2 ON ( m1.object2_id IN (
SELECT aliases_of(m2.object1_id) );
Is there a way to speed up this query? I'd also have to be able to
traverse the mapping_table ever further, following a path of things that
'lead to' other things.
I hope I made myself clear a bit...
Any help appreciated. Many thanks,
jan.
################################################################
(A) TABLE: alias_table object1_id | object1_name | object2_id | object2_name
-----------------------------------------------------1 | name1 | 2 | name2 3 | name3
| 4 | name4
(B) TABLE: mapping_table object1_id | object1_name | object2_id | object2_name
-----------------------------------------------------1 | name1 | 5 | name5 6 | name6
| 2 | name2
(C) FUNCTION: aliases_of CREATE FUNCTION aliases_of(bigint) RETURNS SETOF bigint AS 'SELECT $1 UNION SELECT
object1_idFROM alias_table WHERE object2_id = $1 UNION SELECT object2_id FROM alias_table WHERE object1_id = $1
' LANGUAGE SQL;
################################################################
---------The obligatory disclaimer--------
The information contained in this e-mail (including any attachments) is
confidential and is intended for the use of the addressee only. The
opinions expressed within this e-mail (including any attachments) are
the opinions of the sender and do not necessarily constitute those of
Roslin Institute (Edinburgh) ("the Institute") unless specifically
stated by a sender who is duly authorised to do so on behalf of the
Institute.