Subject | Re: [firebird-support] Why there are always one natural file in query |
---|---|
Author | Helen Borrie |
Post date | 2004-09-09T08:52:03Z |
At 04:25 PM 9/09/2004 -0800, you wrote:
against the FK indexes uses by the plan, to observe a) their selectivity
and b) the length of the longest duplicated chain (Max Dup).
the key value(s) of the last set you looked at and use it to find the next
set you want; you eliminate the creation of a set merely to discard all but
"n" rows of it.
make an inefficient query a little faster, but it won't make an inefficient
query efficient.
INDEX statement.
"First n" often implies that you want the "top" or highest values
first. When that is the case, the normal ASC index will work against
you. For example, if you want the "most recent" 10 rows and you have a
(default) ascending index on the date, then the index will have the most
recent dates at the END of the index. If you create a descending index,
the most recent dates will be at the beginning.
./heLen
>At 17:02 2004.09.08, Helen Borrie wrote:Some foreign key indexes are terribly unselective. Try running gstat
>
> >To get this thread back on topic, and away from a debate on whether
> >underscores are nice or not, ------
> >
> >Of course, you are getting the SORT because of the ORDER BY. It doesn't
> >make sense to use SELECT FIRST n without an ORDER BY clause.
> >
> >The optimizer is choosing NATURAL order for the join method, not the sort
> >method. Don't make the mistake of thinking that "NATURAL" means "bad" for
> >the left stream of a join. It means that the optimizer has calculated that
> >it will be faster to form a binary match structure *once* from the left
> >stream and to re-use that, than to repeatedly walk through an index...or,
> >simply, that a suitable index is not available.
> >
> >EVERY call to SELECT FIRST n has to form the entire set first, order the
> >entire set, output the 'n' rows and discard the rest. So, to speed this
> >up. make sure that
> >1) your WHERE clause limits the output sufficiently so that the sort set is
> >of a reasonable size
>
>I limit the result set to 100 and still very slow.
>
> >2) there are good indexes on the right side (relative to the left side of
> >the join in each respective join) to use for the WHERE search..I'd want to
> >look at foreign key indexes to make sure they are decently selective and,
> >if not, I'd add an OR to avoid using that index
>
>Yes, the fields on the right side are all foreign key constraint against
>left side.
against the FK indexes uses by the plan, to observe a) their selectivity
and b) the length of the longest duplicated chain (Max Dup).
> >3) think about whether SELECT FIRST n is really the way you want to getBefore SELECT FIRST arrived, we managed fine without it. :-)
> >this set. Before SELECT FIRST existed, we used to use parameterised SPs to
> >fetch these sets and, IMO, it's still faster with large tables
>
>Since the application is browser based. SELECT FIRST n is necessary.
>How is the improvement can expect if use SPs ?You can make use of good indexes to fetch the "master" set; you can pass
the key value(s) of the last set you looked at and use it to find the next
set you want; you eliminate the creation of a set merely to discard all but
"n" rows of it.
>I'm now using 1.0, is that using 1.5 would have improvement on these matter ?Optimization was improved in 1.5. It's up to you what you try. It might
make an inefficient query a little faster, but it won't make an inefficient
query efficient.
> >4) in any case, look at how some descending indexes on the ORDER BY columnsHow to define a descending index? Use the DESC key word on the CREATE
> >might assist the arrival of the first n rows from the sort
>
>How to ?
INDEX statement.
"First n" often implies that you want the "top" or highest values
first. When that is the case, the normal ASC index will work against
you. For example, if you want the "most recent" 10 rows and you have a
(default) ascending index on the date, then the index will have the most
recent dates at the END of the index. If you create a descending index,
the most recent dates will be at the beginning.
./heLen