On Fri, 7 Jul 2017 18:07:55 +0300 Dmitry Yemanov wrote > 07.07.2017 17:51, Paul Reeves wrote: > > > But that doesn't answer all my questions... > > > > Given > > > > where e.EMP_NO = COALESCE(?, e.emp_no ) > > > > and that there is an index on EMP_NO, why doesn't the optimiser > > default to the index. After all, it is logically more likely that a > > value will be passed in the where condition, rather than a NULL. > > To evaluate COALESCE, e.emp_no must be known. How it can be known > before we start reading the table (via index scan)? Chicken and egg > problem. >
I understand that evaluating COALESCE(?, e.emp_no ) at prepare time may require a circular logic and is thus impractical but surely the more important piece of information is in the where e.emp_no = A unique index exists on this column so surely the optimiser should choose it instead of a natural scan ? The other question I asked was... why can't I force the plan... PLAN (E INDEX (RDB$PRIMARY7)) This error is raised... 'cannot be used in the specified plan' And a supplementary question (perhaps it merits a separate thread ) 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? 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