As a senior software and database developer, this is my experience:

If anything can go wrong, it will! also known as "Murphy's law"

Happy coding
Christian

--- In firebird-support@yahoogroups.com, "skander_sp" <skander_sp@...> wrote:
>
> Is not a problem the concurrence, because this specifica case, only a dozen 
> of user working toghether and not probably they insert in the same 
> milisecond, but thks for the notice.
> 
> And about the optimized index, I finally undestand, but i hope to get a 
> instant result for last year (actually only used)
> 
> 
> --- In firebird-support@yahoogroups.com, Ann Harrison <aharrison@> wrote:
> >
> > On Tue, Apr 16, 2013 at 3:57 AM, skander_sp <skander_sp@> wrote:
> > 
> > >
> > > Simple table
> > >
> > > CREATE TABLE ORDENES (
> > >     ID_ORDEN  INTEGER NOT NULL /* Primary key - GenId */
> > >     YEAR_ORDEN INTEGER NOT NULL /* Year of Orden */,
> > >     N_ORDEN INTEGER NOT NULL /* Order in the Year */,
> > >     ... /* no matter */
> > > );
> > >
> > > ALTER TABLE ORDENES ADD CONSTRAINT UK_ORDENES UNIQUE (YEAR_ORDEN,
> > > N_ORDEN)USING DESCENDING INDEX UK_ORDENES_YEAR_N_ORDEN;
> > >
> > >
> > > Now I need to access in the insert trigger, for next order to be assigned
> > > to N_ORDEN in the YEAR_ORDEN using
> > >
> > >    select coalesce(max(o.n_orden),0)+1
> > >       from ordenes o
> > >       where o.year_orden=new.year_orden
> > >       into new.n_orden
> > >
> > > IT WORK!!!! nice,
> > 
> > 
> > Not nice at all.  It works single user, but it will fail in production, and
> > you will get violations of your unique constraint. Remember that Firebird
> > uses MVCC.   If two concurrent transactions run the insert trigger they
> > will generate the same value for new.n_orden.
> > 
> > 
> > 
> > > BUT NOT OPTIMIZED, in the Performance Analisys it read (indexed) all the
> > > N_ORDEN in the table, not going to the first (given the descending order 
> > > of
> > > the index)
> > >
> > > How can optimize the index/query?
> > > Or simply is not possible doing more?
> > >
> > >
> > Firebird can use an index to optimize MAX, but only if it's the MAX of the
> > whole key - not a partial key match. If you have a descending index on
> > year_orden, Firebird will use an index to find the MAX of year_orden by
> > walking down the left hand side of the index tree.   You're asking it to
> > find a specific year first, then the highest value of n_orden and that
> > doesn't work.  Even if it did, this code doesn't produce good unique
> > numbers.
> > 
> > Good luck,
> > 
> > Ann
> > 
> > 
> > [Non-text portions of this message have been removed]
> >
>


Reply via email to