Thanks John it dont seems to work, but in my context I only needed data from the rt_node table so I tried this:
select * from rt_node n where node_id = 2 and exists (select edge_id from rt_edge where start_node_id = n.node_id or end_node_id = n.node_id) and it gave me this plan (even if I remove the stupid node_id = 2 condition): Index Scan using rt_node_pkey on rt_node n (cost=0.00..6.15 rows=1 width=25) Index Cond: (node_id = 2) Filter: (subplan) SubPlan -> Index Scan using rt_edge_start_node, rt_edge_end_node on rt_edge (cost=0.00..12.56 rows=4 width=4) Index Cond: ((start_node_id = $0) OR (end_node_id = $0)) this time it use my two indexes, maybe because he know that the same value is compared in the two condition... I should ask my mother if she got an idea, mothers know a lot of stuff! On 5/25/05, John A Meinel <[EMAIL PROTECTED]> wrote: > Jocelyn Turcotte wrote: > > >Hi all > >i dont know if this is normal, but if yes i would like to know why and > >how I could do it another way other than using unions. > > > > > > The only thing that *might* work is if you used an index on both keys. > So if you did: > > CREATE INDEX rt_edge_start_end_node ON rt_edge(start_node_id,end_node_id); > > The reason is that in an "OR" construct, you have to check both for being > true. So in the general case where you don't know the correlation between the > columns, you have to check all of the entries, because even if you know the > status of one side of the OR, you don't know the other. > > Another possibility would be to try this index: > > CREATE INDEX rt_edge_stare_or_end ON rt_edge(start_node_id OR end_node_id); > > I'm not sure how smart the planner can be, though. > > John > =:-> > > > > > ---------------------------(end of broadcast)--------------------------- TIP 3: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to [EMAIL PROTECTED] so that your message can get through to the mailing list cleanly