Strange Stored Proc Behaviour with Blob Blob Variables
------------------------------------------------------

                 Key: CORE-5114
                 URL: http://tracker.firebirdsql.org/browse/CORE-5114
             Project: Firebird Core
          Issue Type: Bug
          Components: Engine
    Affects Versions: 2.5.5, 3.0 RC1
         Environment: Windows 10, fb255x64, fb30rc1x64
            Reporter: Holger Klemt
         Attachments: db1.fbk

today i demonstrated to some customer on our Firbeird softwaretraining held in 
munich some technologies they should use to improve their work and some they 
should avoid. 
I know that using blob as variables or params inside a stored procedure have 
some really big disadvantages, but i was not aware of some part of the result. 

the facts: We used the ibexpert demo database and created 10000 records as 
testdata in table products. To demonstrate the bad way, we added this stored 
proc:
using blob params and manipulate them for every found record. This is slow and 
needs a lot of memry, basic reasons for this problems are know from my side
Procedure execution time was around 45 seconds even not a single record should 
be written to disk. 

The really bad thing that right after executing this stored proc, the database 
filesize changed from about 25MB to more than 3GB. The SP does not a single 
update or insert ....  You can also see from statistics that  firebird wrote 
about 190000 pages. 

create or alter procedure GETPRODUCTS
returns (
    RES blob sub_type 1 segment size 80)
as
declare variable ACTOR blob sub_type 1 segment size 80;
begin
  res='';
  for
    select product.actor
    from product
    into :actor
  do
  begin
    res=res||'
'||actor;
  end
  suspend;
end

------------------------------------------------
Prepare       : 16,00 ms
Execute       : 44.906,00 ms
Avg fetch time: 44.906,00 ms

Memory
------------------------------------------------
Current: 96.756.864
Max    : 106.806.792
Buffers: 5.000

Operations
------------------------------------------------
Read   : 85
Writes : 189.558
Fetches: 799.256
Marks  : 583.503


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates 
| Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         
|         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|PRODUCT                        |         0 |         0 |       10000 |       0 
|       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+


Workaround for users

this is a procedure i demonstrated as a workaround, which does basically the 
same, but collects the data
using varchar variables as log as it fits and only copy them to the result when 
there is no more free space in 
varchar. The execution takes only 350 ms and does not affect the size of the 
database, since it does not a single 
page write (as expected).


basically the first stored proc is definitly a valid way to write a sp, but 
there must be something very strange 
going on inside Firebird. 

The test was made with a firebird 255 on windows 64 and also with firebird 3 
rc1, both had exactly the same 
strange behaviour extending the size of the database to 3GB without any real 
acceptable reason. 


create or alter procedure GETPRODUCTS
returns (
    RES blob sub_type 1 segment size 80)
as
declare variable ACTOR varchar(200);
declare variable Z varchar(32000);
begin
  res='';
  z='';
  for
    select product.actor
    from product
    into :actor
  do
  begin
    z=z||'
'||actor;
    if (char_length(z)>31000) then
    begin
      res=res||z;
      z='';
    end
  end
    if (z<>'') then
    begin
      res=res||z;
      z='';
    end
  suspend;
end



Query Time
------------------------------------------------
Prepare       : 16,00 ms
Execute       : 359,00 ms
Avg fetch time: 359,00 ms

Memory
------------------------------------------------
Current: 87.044.576
Max    : 87.230.256
Buffers: 5.000

Operations
------------------------------------------------
Read   : 79
Writes : 0
Fetches: 20.751
Marks  : 365


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|          Table Name           |  Records  |  Indexed  | Non-Indexed | Updates 
| Deletes | Inserts | Backouts |  Purges  | Expunges |
|                               |   Total   |   reads   |    reads    |         
|         |         |          |          |          |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|PRODUCT                        |         0 |         0 |       10000 |       0 
|       0 |       0 |        0 |        0 |        0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to