Re: optimizing a query over tree-like structure - Mailing list pgsql-sql

From az@svilendobrev.com
Subject Re: optimizing a query over tree-like structure
Date
Msg-id 200809301724.21534.az@svilendobrev.com
Whole thread Raw
In response to Re: optimizing a query over tree-like structure  ("Oliveiros Cristina" <oliveiros.cristina@marktest.pt>)
List pgsql-sql
another idea i just got, to decrease the number of tables in one FROM, 
is to represent the first-level ORs with unions. but i'm not sure how 
exactly to do it: are these equivalent?

FROM N,ownership,mm_N2R
where ( N.dbid = ownership.NORN.dbid = mm_N2R.left AND mm_N2R.right = ownership.ROR
...
) AND N.obj = whatever-filter-by-N

--------

FROM (
(ownership join N on ownership.N = N.dbid)union
(ownership join mm_N2R on ownership.R = mm_N2R.right join N on 
mm_N2R.left = N.dbid )OR
) ...

and should i bundle the filtering-by-N/Employment in every of above 
union-members?

On Tuesday 30 September 2008 15:21:09 Oliveiros Cristina wrote:
> Hi, Svil
>
> I 'd like to first fully understand the background of your problem
> before figurin out if I can be of any help (or not).
>
> You have a tree, of which N is the root, is this correct?
> Then, what are the next sublevel?
> F, P and R? If so, why is R linked to a sibling (F) ?
> And the next one?
> O and Z?
> Is O connected to itself?
> And i am not understanding your concept of "shortcuts". Could you
> please explain ?
> What kind of tree do you have exactly? Binary? Trenary?
> The mm_* tables keep relations between nodes, I guess.... If so ,
> the mm_N2Z one is empty, in this example, right?As there is no edge
> from N to Z (not direct).
> But what is the Nazn table? What records does it keep?
> And what is the ownership table? And the value?
> Could you tell which columns these tables have, at least the
> relevant ones for your problem ?
>
> Please kindly advice me on these issues.
> I am not very specialized in optimizing queries, but I see you have
> a lot of cartesian products on your FROM clause, which, from my own
> experience, I guess it has tendency to be slow...
>
> Best,
>
> Oliveiros
>
> ----- Original Message -----
> From: <az@svilendobrev.com>
> To: <pgsql-sql@postgresql.org>
> Sent: Tuesday, September 30, 2008 9:32 AM
> Subject: [SQL] optimizing a query over tree-like structure
>
> > 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




pgsql-sql by date:

Previous
From: "Richard Broersma"
Date:
Subject: Re: Finding sequential records
Next
From: "Oliveiros Cristina"
Date:
Subject: Re: optimizing a query over tree-like structure