Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member
0 Kudos


We are using HANA version 1.00.70.

I wondering SQL procedure's "call-performance".

Below my test statements.
Test shows that direct insert compared procedure call's insert is about 20 times faster.
HANA insert statement is ~3600; but with procedure call it is only 180!
On standard laptop and SQL Server 2005; both execution takes same time and output is about 1500 events per seconds.

Do you have idea what causes huge difference for executions ?
It looks like HANA makes "execution plans" or something similar everytime procedure has called
(does not have cached plans).


drop table JRE_2.TestLoad;
create column table JRE_2.TestLoad (MyNumber int);

drop procedure JRE_2.MyValueInsert;
create Procedure JRE_2.MyValueInsert(v_MyNumber int)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
AS 
BEGIN
insert into JRE_2.TestLoad (MyNumber) values (v_MyNumber);
END;


drop procedure JRE_2.InsertTest;
create Procedure JRE_2.InsertTest(v_CallProc tinyint)
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
AS 
BEGIN

declare lv_StartTime datetime :=now();
declare lv_EndTime datetime;
declare lv_LoopNumber int :=0;
declare lv_MethodUsed varchar(16);

if ifnull(v_CallProc,0) = 0 then
  lv_MethodUsed := 'Insert';
else
  lv_MethodUsed := 'Procedure call';
end if; 

while (lv_LoopNumber <=50000) do
 
  if (lv_MethodUsed = 'Insert') then
   insert into JRE_2.TestLoad (MyNumber) values (lv_LoopNumber);
  else
   call JRE_2.MyValueInsert(lv_LoopNumber);
  end if;
 
  lv_LoopNumber := lv_LoopNumber + 1;

end while;

lv_EndTime := now();

select lv_MethodUsed as InsertMethod, lv_LoopNumber as Cnt, seconds_between(lv_StartTime,lv_EndTime) as Duration, cast(lv_LoopNumber/seconds_between(lv_StartTime,lv_EndTime) as int) as InsertsPerSeconds
from dummy;

END;


/* Tests for insert statement */

drop table JRE_2.TestLoad;
create column table JRE_2.TestLoad (MyNumber int);
call JRE_2.InsertTest(0);

==> Results:
INSERTMETHOD; CNT; DURATION; INSERTSPERSECONDS
Insert;   50001; 13;   3 846
Insert;   50001; 14;   3571


/* Test for procedure calls  */
drop table JRE_2.TestLoad;
create column table JRE_2.TestLoad (MyNumber int);

call JRE_2.InsertTest(1);

==> Results:
INSERTMETHOD; CNT; DURATION; INSERTSPERSECONDS
Procedure call; 50001; 276;  181
Procedure call; 50001; 277;  180