Re: [firebird-support] Performance optimation?

2014-12-16 Thread Svein Erling Tysvær svein.erling.tysv...@kreftregisteret.no [firebird-support]
Hello,

I save values in some tables (simpler description)

First a Table who saved the timestamp of the mensuration
Table A timestamps
ID primary key
TS timestamp

Second a Table with the measured data (25 records/measured sensors will be 
saved every 10 Minutes, one record in Table A, 25 in Table B)
Table B mensuration
ID primary key
ID_counter integer of item to measure
ID_Timestamp foreign key of Table A
Value (double precision)

Now I would like to make an analysis. At the time, I do this:

for select cast(ts as date) as mz from tablea where ts = “criteria from” and 
ts  “criteria to”
group by mz)
into :messzeit do
begin
  f_messwert = null;
  MESSWERTE = '';
  for select a.id_counter, sum(a.value) from tableb a left join tablea b 
 on a.id_timestamp = b.id
  where cast(b.ts as date) = :messzeit
  group by a.id_counter
  into :i_zae, :f_messwert do
  begin
if(f_messwert is null) then f_messwert = 0;
MESSWERTE = MESSWERTE || cast(:i_zae as varchar(4)) || '=' || 
 cast(:f_messwert as varchar(8)) || ';';
  end
  suspend;
end

The Result is one returned record for each day (day, conter 1 = 123; counter 2 
= 222;…)

It takes a long time but I must integrate the tablea on the second part of the 
statement. How can I optimize this in firebird?


One thing to notice, Olaf, is that where cast(b.ts as date) will never use an 
index (if you have an index on TS). I would suggest changing that part of the 
query to something like:

where cast(b.ts as date) = :messzeit
   and b.ts between :messzeit and :messzeit + 1

The first line limits the result to what you want, the second uses an index (if 
you have one).

Maybe you could replace your two 'for select's with one, like this:

begin
  messzeit2 = null;
  for select cast(a.ts as date), b.id_counter, sum(b.value) 
  from tableb b 
  join tablea a on b.id_timestamp = a.id
  where a.ts = “criteria from” and a.ts  “criteria to”
  group by 1, 2
  into :messzeit, :i_zae, :f_messwert do
  begin
if (messzeit  messzeit2) then
begin
  messzeit2 = messzeit;
  f_messwert = null;
  MESSWERTE = '';
end
if(f_messwert is null) then f_messwert = 0;
MESSWERTE = MESSWERTE || cast(:i_zae as varchar(4)) || '=' || 
cast(:f_messwert as varchar(8)) || ';';
  end
  suspend;
end

Does this work, and is it any faster?

If this is a new project that should end up with a database lasting for quite 
some time, I would recommend you to reconsider your primary key. The reason 
being that primary keys ought to never have any business meaning (doesn't 
really matter if it is an integer, GUID or whatever). If you are certain that 
requirements will never change, then fine, but if things later could change so 
that there could be several records with the same timestamp, then this is 
something that is considerably simpler to fix if the timestamp is not a primary 
key.

HTH,
Set





++

Visit http://www.firebirdsql.org and click the Documentation item
on the main (top) menu.  Try FAQ and other links from the left-side menu there.

Also search the knowledgebases at http://www.ibphoenix.com/resources/documents/ 

++


Yahoo Groups Links

* To visit your group on the web, go to:
http://groups.yahoo.com/group/firebird-support/

* Your email settings:
Individual Email | Traditional

* To change settings online go to:
http://groups.yahoo.com/group/firebird-support/join
(Yahoo! ID required)

* To change settings via email:
firebird-support-dig...@yahoogroups.com 
firebird-support-fullfeatu...@yahoogroups.com

* To unsubscribe from this group, send an email to:
firebird-support-unsubscr...@yahoogroups.com

* Your use of Yahoo Groups is subject to:
https://info.yahoo.com/legal/us/yahoo/utos/terms/



Re: [firebird-support] Performance optimation?

2014-12-16 Thread 'Carlos H. Cantu' lis...@warmboot.com.br [firebird-support]
SETsetknfs One thing to notice, Olaf, is that where cast(b.ts as
SETsetknfs date) will never use an index (if you have an index on
SETsetknfs TS).

Just a note: afair, it can use an index if you have the index key
defined also as cast(b.ts as date).

Carlos
Firebird Performance in Detail - http://videos.firebirddevelopersday.com
www.firebirdnews.org - www.FireBase.com.br

Hello,

I save values in some tables (simpler description)

First a Table who saved the timestamp of the mensuration
Table A timestamps
ID primary key
TS timestamp

Second a Table with the measured data (25 records/measured sensors will be 
saved every 10 Minutes, one record in Table A, 25 in Table B)
Table B mensuration
ID primary key
ID_counter integer of item to measure
ID_Timestamp foreign key of Table A
Value (double precision)

Now I would like to make an analysis. At the time, I do this:

for select cast(ts as date) as mz from tablea where ts = “criteria from” and 
ts  “criteria to”
group by mz)
into :messzeit do
begin
  f_messwert = null;
  MESSWERTE = '';
  for select a.id_counter, sum(a.value) from tableb a left join tablea b 
 on a.id_timestamp = b.id
  where cast(b.ts as date) = :messzeit
  group by a.id_counter
  into :i_zae, :f_messwert do
  begin
if(f_messwert is null) then f_messwert = 0;
MESSWERTE = MESSWERTE || cast(:i_zae as varchar(4)) || '=' || 
 cast(:f_messwert as varchar(8)) || ';';
  end
  suspend;
end

The Result is one returned record for each day (day, conter 1 = 123; counter 
2 = 222;…)

It takes a long time but I must integrate the tablea on the second part of 
the statement. How can I optimize this in firebird?


SETsetknfs One thing to notice, Olaf, is that where cast(b.ts as
SETsetknfs date) will never use an index (if you have an index on
SETsetknfs TS). I would suggest changing that part of the query to something 
like:







++

Visit http://www.firebirdsql.org and click the Documentation item
on the main (top) menu.  Try FAQ and other links from the left-side menu there.

Also search the knowledgebases at http://www.ibphoenix.com/resources/documents/ 

++


Yahoo Groups Links

* To visit your group on the web, go to:
http://groups.yahoo.com/group/firebird-support/

* Your email settings:
Individual Email | Traditional

* To change settings online go to:
http://groups.yahoo.com/group/firebird-support/join
(Yahoo! ID required)

* To change settings via email:
firebird-support-dig...@yahoogroups.com 
firebird-support-fullfeatu...@yahoogroups.com

* To unsubscribe from this group, send an email to:
firebird-support-unsubscr...@yahoogroups.com

* Your use of Yahoo Groups is subject to:
https://info.yahoo.com/legal/us/yahoo/utos/terms/



Re: [firebird-support] Performance optimation?

2014-12-15 Thread Mark Rotteveel m...@lawinegevaar.nl [firebird-support]
On Mon, 15 Dec 2014 16:01:27 +0100, 'checkmail' check_m...@satron.de
[firebird-support] firebird-support@yahoogroups.com wrote:
 Now I would like to make an analysis. At the time, I do this:
 
 for select cast(ts as date) as mz from tablea where ts = criteria
from
 and ts  criteria to
 group by mz)
 into :messzeit do
 begin
   f_messwert = null;
   MESSWERTE = '';
   for select a.id_counter, sum(a.value) from tableb a left join
tablea
   b
 on a.id_timestamp = b.id
   where cast(b.ts as date) = :messzeit
   group by a.id_counter
   into :i_zae, :f_messwert do
   begin
 if(f_messwert is null) then f_messwert = 0;
 MESSWERTE = MESSWERTE || cast(:i_zae as varchar(4)) || '=' ||
 cast(:f_messwert as varchar(8)) || ';';
   end
   suspend;
 
 end
 
 The Result is one returned record for each day (day, conter 1 = 123;
 counter
 2 = 222;.)
 
 It takes a long time but I must integrate the tablea on the second part
of
 the statement. How can I optimize this in firebird?

That is not surprising. You are executing a query and for each row you are
executing another query. Use joins and/or subqueries instead.

Mark