On Mon, 10 Jul 2017 12:31:43 +0300 Dmitry Yemanov wrote

> 
> > The other question I asked was...
> > 
> >      why can't I force the plan...
> >    
> >        PLAN (E INDEX (RDB$PRIMARY7))  
> 
> Because it's invalid in this case.
> 

I can understand that this plan might appear to be invalid from the
perspective of the optimiser. But surely the whole point of adding the
PLAN clause is because I think I know better than the optimiser what I
want. So to return to the original query:

  where e.EMP_NO = COALESCE( ?, e.emp_no )

surely I ought to be able to add 

  PLAN (E INDEX (RDB$PRIMARY7))  

Then if the parameter resolves to a value at run-time the index will be
used. Obviously if the parameter is null performance would be much
worse than a natural scan because the engine must walk the index pages
and then walk the data pages. But the customer is always right,
surely :-)

( I also understand there is a downside to the customer always being
right argument - one bad customer could screw everything up for all the
others. But is that argument being used here or is it just because of
the way the optimiser works? )


> > What are the rules for deciding when a PLAN statement will be
> > rejected?  
> >>From one logical point of view if have this sort of query  
> > 
> >    select * from mytable m where afield = whatever;
> > 
> > and I add
> > 
> >    plan (m index(myindex ))
> > 
> > the engine should accept that. Shouldn't it?  
> 
> It depends on "whatever". If it's literal or independent expression
> or priorly evaluated field, index scan can be used. If it includes a
> field from the same stream, it cannot.
> 

Why not create a second stream in that case?

that seems to be what happens when I create this query:

   SELECT  *
   FROM employee
   WHERE
     EMP_NO = 2  
   OR
     EMP_NO is null 

this plan is chosen...

  PLAN (EMPLOYEE INDEX (RDB$PRIMARY7, RDB$PRIMARY7))

Because there are two streams the fetches and the indexed reads more or
less double because of the OR clause. 

(Again, a subject for another day is why does the optimiser even bother
with the second stream when EMP_NO can never be null ? )

Anyway, none of the above is any sort of criticism. I'm just trying to
get a better understanding of the rules and maybe find out where things
are broken that could be fixed easily (or hacked around).


Paul
-- 
Paul Reeves
http://www.ibphoenix.com
Supporting users of Firebird
 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to