Josef Gschwendtner wrote:

We have a big table (several million records) and like to select the records regarding one day:

Within the table there is a field (DyStart) which is a Timestamp. A convienient way to select would be:

select * from DY where  cast(DyStart as Date) = :DayOfInterest /* e.g. '31.6.2007' */

Sadly this select cann't use the index on field DyStart.

Therefore the select has to be something like:

... where DyStart >= :DayOfInterest and DyStart < :DayOfInterest + 1

Can you think about something more convenient? Is there a way to optimize the first select (with cast)?

Helen Borrie answers:

In Firebird 2.0.x you can have an expression index - see release notes.

In Fb 1.5.x and below you'd need to add a trigger-populated proxy column for DyStart and index that, e.g.

Alter DY add DyStartdate DATE;

create index ascDyStartdate on DY (DyStartdate);

create trigger biu_DY for DY
active before insert or update
as
declare vtimestamp timestamp;
begin
   if (new.DyStart is not null) then
     new.DyStartdate = cast (new.DyStart as Date);
end
else
  if (updating and old.DyStart is not null) then
     new.DyStartdate = null;
end

Then

select * from DY where  DyStartdate = :DayOfInterest

Like this post? Share on: TwitterFacebookEmail


Related Articles


Author

Firebird Community

Published

Category

Gems from Firebird Support list

Tags