hi.
sorry for the vague syntax used below, but the query is huge so i've 
tried to present it in simple terms. And sorry if i'm doing obviously 
stupid things, i have lots of years programming behind me but NO sql 
involved.
i have a somewhat tree-like structure of objects that link to each 
other via many2many associations. it looks like:
(N is "root")
 N links to R,P,F
 R links to F 
 P links to O,F
 O links to O,F #recursively
 F links to Z
All links to F but the one in O are "shortcuts", to avoid looking it 
up recursively.
each of these objects has some associated values (again many2many,  
ownership).

what i want is to get all the values related to a given N and its  
sublevels, in one query.

one variant of what i've invented so far is (~pseudocode, no recursion 
on O):

SELECT ownership.*, value.*
FROM Nazn, mm_N2P, mm_P2O, mm_O2O, mm_O2O AS mm_O2O1, mm_N2Z, 
     ownership JOIN value ON ownership.value = value.dbid
WHERE (
 N.dbid = ownership.N
 OR
 N.dbid = mm_N2R.left AND mm_N2R.right = ownership.R
 OR
 N.dbid = mm_N2P.left AND (
     mm_N2P.right = ownership.P
     OR
     mm_N2P.right = mm_P2O.left AND (
         mm_P2O.right = ownership.O
         OR
         mm_P2O.right = mm_O2O.left AND (
             mm_O2O.right = ownership.O
             OR
             mm_O2O.right = mm_O2O1.left AND 
                mm_O2O1.right = ownership.O
 )))
 OR
 Nazn.dbid = mm_N2F.left AND (
     mm_N2F.right = ownership.F
     OR
     mm_N2Z.right = ownership.Z
 )
) AND ownership.value = value.dbid AND N.obj = whatever-filter-by-N

----------------
this scales very poor. 
it uses the shortcut to F present in N.
for just 200 rows with related associations, it takes 4 seconds to get 
result.
if i use the shortcut to F present in P, it takes 2 seconds - but 
thats still inacceptable.
seems that the number or consequtive ORs on same level is killing it.
EXPLAIN gives nested loops all over.
What am i doing wrong here? 
should i expand the A-to-B links of the sort 
mm_N2P.right = mm_P2O.left 
into 
mm_N2P.right = P.dbid and P.dbid == mm_P2O.left ?

the query is generated via sqlalchemy and a layer on top, so i can 
tweak it any way required (and it has many other sub/filterings which 
i've ommited for brevity - they dont make it better/worse).

any pointers of how such queries should be written are appreciated - 
e.g. what is considered fine, what doable and what is a no-no. 

thanks ahead
ciao
svil

www.svilendobrev.com
dbcook.sf.net

-- 
Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-sql

Reply via email to