
Thank you Alberto, In my case i am using the same syntax as in a select query, so there must be something other the calculation in the function itself. As martin proposed to write a C or Python language, I tried this path with Python with no luck. Checking the query trace: 120633 profiler.starttrace(); 2 X_32=0@0:void := querylog.define("trace\nselect db.daybracket(\"Expiry_Date\")from \"db\".\"table1\" limit 1\n;":str,"default_pipe":str,93:int); 7 X_1=0:int := sql.mvc(); 13 X_22=<tmp_30374>[0]:bat[:int] := bat.new(nil:oid,nil:int); 15 X_15=<tmp_35032>[0]:bat[:str] := bat.new(nil:oid,nil:str); 4 X_31=<tmp_30374>[1]:bat[:int] := bat.append(X_22=<tmp_30374>[1]:bat[:int],0:int); 5 X_23=<tmp_35032>[1]:bat[:str] := bat.append(X_15=<tmp_35032>[1]:bat[:str],"db.L":str); 5 X_20=<tmp_42074>[0]:bat[:int] := bat.new(nil:oid,nil:int); 13 X_43=<tmp_24353>[140179]:bat[:oid] := sql.tid(X_1=0:int,"db":str,"table1":str,0:int,4:int); 3 X_29=<tmp_42074>[1]:bat[:int] := bat.append(X_20=<tmp_42074>[1]:bat[:int],10:int); 10 X_19=<tmp_35141>[0]:bat[:str] := bat.new(nil:oid,nil:str); 10 X_18=<tmp_25467>[0]:bat[:str] := bat.new(nil:oid,nil:str); 5 X_27=<tmp_35141>[1]:bat[:str] := bat.append(X_19=<tmp_35141>[1]:bat[:str],"char":str); 4 X_25=<tmp_25467>[1]:bat[:str] := bat.append(X_18=<tmp_25467>[1]:bat[:str],"daybracket_Expiry_Date":str); 400 (X_52=<tmp_2031>[0]:bat[:oid],X_53=<tmp_4241>[0]:bat[:date]) := sql.bind(X_1=0:int,"db":str,"table1":str,"Expiry_Date":str,2:int,0:int,4:int); 4105 X_48=<tmp_35357>[140179]:bat[:date] := sql.bind(X_1=0:int,"db":str,"table1":str,"Expiry_Date":str,0:int,0:int,4:int); 237 X_60=<tmp_37213>[140179]:bat[:date] := sql.projectdelta(X_43=<tmp_24353>[140179]:bat[:oid],X_48=<tmp_35357>[140179]:bat[:date],X_52=<tmp_2031>[0]:bat[:oid],X_53=<tmp_4241>[0]:bat[:date]); 5221 barrier X_87=false:bit := language.dataflow(); 13 X_107=<tmp_24574>[0]:bat[:str] := bat.new(nil:oid,nil:str); 236 barrier (X_111=0@0:oid,X_112="2016-02-12":date) := iterator.new(X_60=<tmp_37213>[140179]:bat[:date]); 4 sql.mvc(); 1 calc.str("pdate":str); 0 X_6="%Y-%m-%d":str := calc.str("%Y-%m-%d":str); 1 X_8="2016-02-12":str := mtime.date_to_str(X_5="2016-02-12":date,X_6="%Y-%m-%d":str); 2 X_9="2016-02-12":str := calc.str(4:int,0:int,0:int,0:int,X_8="2016-02-12":str,10:int); 50 function user.daybracket(Apdate:date):str; 63 X_114="2016-02-12":str := user.daybracket(X_112="2016-02-12":date); 2 bat.append(X_107=<tmp_24574>[1]:bat[:str],X_114="2016-02-12":str); 217 redo (X_111=1@0:oid,X_112="2016-02-12":date) := iterator.next(X_60=<tmp_37213>[140179]:bat[:date]); 3 sql.mvc(); 1 calc.str("pdate":str); 0 X_6="%Y-%m-%d":str := calc.str("%Y-%m-%d":str); 1 X_8="2016-02-12":str := mtime.date_to_str(X_5="2016-02-12":date,X_6="%Y-%m-%d":str); 1 X_9="2016-02-12":str := calc.str(4:int,0:int,0:int,0:int,X_8="2016-02-12":str,10:int); 45 function user.daybracket(Apdate:date):str; 55 X_114="2016-02-12":str := user.daybracket(X_112="2016-02-12":date); 1 bat.append(X_107=<tmp_24574>[2]:bat[:str],X_114="2016-02-12":str); 295 redo (X_111=2@0:oid,X_112="2016-02-12":date) := iterator.next(X_60=<tmp_37213>[140179]:bat[:date]); 1 sql.mvc(); 1 calc.str("pdate":str); 1 X_6="%Y-%m-%d":str := calc.str("%Y-%m-%d":str); 1 X_8="2016-02-12":str := mtime.date_to_str(X_5="2016-02-12":date,X_6="%Y-%m-%d":str); 1 X_9="2016-02-12":str := calc.str(4:int,0:int,0:int,0:int,X_8="2016-02-12":str,10:int); 44 function user.daybracket(Apdate:date):str; 58 X_114="2016-02-12":str := user.daybracket(X_112="2016-02-12":date); 1 bat.append(X_107=<tmp_24574>[3]:bat[:str],X_114="2016-02-12":str); 232 redo (X_111=3@0:oid,X_112="2016-02-12":date) := iterator.next(X_60=<tmp_37213>[140179]:bat[:date]); 4 sql.mvc(); 1 calc.str("pdate":str); 0 X_6="%Y-%m-%d":str := calc.str("%Y-%m-%d":str); 1 X_8="2016-02-12":str := mtime.date_to_str(X_5="2016-02-12":date,X_6="%Y-%m-%d":str); 1 X_9="2016-02-12":str := calc.str(4:int,0:int,0:int,0:int,X_8="2016-02-12":str,10:int); 46 function user.daybracket(Apdate:date):str; 55 X_114="2016-02-12":str := user.daybracket(X_112="2016-02-12":date); 2 bat.append(X_107=<tmp_24574>[4]:bat[:str],X_114="2016-02-12":str); 214 redo (X_111=4@0:oid,X_112="2016-02-12":date) := iterator.next(X_60=<tmp_37213>[140179]:bat[:date]); 4 sql.mvc(); 0 calc.str("pdate":str); 0 X_6="%Y-%m-%d":str := calc.str("%Y-%m-%d":str); 1 X_8="2016-02-12":str := mtime.date_to_str(X_5="2016-02-12":date,X_6="%Y-%m-%d":str); 1 X_9="2016-02-12":str := calc.str(4:int,0:int,0:int,0:int,X_8="2016-02-12":str,10:int); 44 function user.daybracket(Apdate:date):str; 53 X_114="2016-02-12":str := user.daybracket(X_112="2016-02-12":date); 1 bat.append(X_107=<tmp_24574>[5]:bat[:str],X_114="2016-02-12":str); 243 redo (X_111=5@0:oid,X_112="2016-02-12":date) := iterator.next(X_60=<tmp_37213>[140179]:bat[:date]); 4 sql.mvc(); 0 calc.str("pdate":str); 0 X_6="%Y-%m-%d":str := calc.str("%Y-%m-%d":str); 1 X_8="2016-02-12":str := mtime.date_to_str(X_5="2016-02-12":date,X_6="%Y-%m-%d":str); 1 X_9="2016-02-12":str := calc.str(4:int,0:int,0:int,0:int,X_8="2016-02-12":str,10:int); 45 function user.daybracket(Apdate:date):str; 54 X_114="2016-02-12":str := user.daybracket(X_112="2016-02-12":date); 3 bat.append(X_107=<tmp_24574>[6]:bat[:str],X_114="2016-02-12":str); 214 redo (X_111=6@0:oid,X_112="2016-02-12":date) := iterator.next(X_60=<tmp_37213>[140179]:bat[:date]); 3 sql.mvc(); 1 calc.str("pdate":str); 1 X_6="%Y-%m-%d":str := calc.str("%Y-%m-%d":str); 1 X_8="2016-02-12":str := mtime.date_to_str(X_5="2016-02-12":date,X_6="%Y-%m-%d":str); 1 X_9="2016-02-12":str := calc.str(4:int,0:int,0:int,0:int,X_8="2016-02-12":str,10:int); 44 function user.daybracket(Apdate:date):str; 53 X_114="2016-02-12":str := user.daybracket(X_112="2016-02-12":date); 2 bat.append(X_107=<tmp_24574>[7]:bat[:str],X_114="2016-02-12":str); 212 redo (X_111=7@0:oid,X_112="2016-02-12":date) := iterator.next(X_60=<tmp_37213>[140179]:bat[:date]); 3 sql.mvc(); 1 calc.str("pdate":str); 1 X_6="%Y-%m-%d":str := calc.str("%Y-%m-%d":str); 0 X_8="2016-02-12":str := mtime.date_to_str(X_5="2016-02-12":date,X_6="%Y-%m-%d":str); 1 X_9="2016-02-12":str := calc.str(4:int,0:int,0:int,0:int,X_8="2016-02-12":str,10:int); 46 function user.daybracket(Apdate:date):str; 54 X_114="2016-02-12":str := user.daybracket(X_112="2016-02-12":date); 2 bat.append(X_107=<tmp_24574>[8]:bat[:str],X_114="2016-02-12":str); 240 redo (X_111=8@0:oid,X_112="2016-02-12":date) := iterator.next(X_60=<tmp_37213>[140179]:bat[:date]); 3 sql.mvc(); 1 calc.str("pdate":str); 0 X_6="%Y-%m-%d":str := calc.str("%Y-%m-%d":str); 0 X_8="2016-02-12":str := mtime.date_to_str(X_5="2016-02-12":date,X_6="%Y-%m-%d":str); 1 X_9="2016-02-12":str := calc.str(4:int,0:int,0:int,0:int,X_8="2016-02-12":str,10:int); 44 function user.daybracket(Apdate:date):str; 53 X_114="2016-02-12":str := user.daybracket(X_112="2016-02-12":date); 2 bat.append(X_107=<tmp_24574>[9]:bat[:str],X_114="2016-02-12":str); On Wed, Dec 21, 2016 at 4:26 PM, Alberto Ferrari < aferrari@starconnecting.com> wrote:
Imad, we had the same problem (you can find our mail in list with subject "Functions in Monetdb", date nov/22), and had no satisfactory solution yet. I think monetDb is not good for UDF yet... (though is great db engine!)
2016-12-21 10:40 GMT-03:00 imad hajj chahine <imad.hajj.chahine@gmail.com
: Hi,
I have a weird behavior when i package some sql code in a function, the performance deteriorate. The same code running directly in select statement is blinking fast. ex:
select date_to_str("Expiry_Date",'%Y-%m-%d') from table: exec time is 0.72s
if i create a function: CREATE FUNCTION DayBracket(pdate date) returns char(10) BEGIN return date_to_str(pdate,'%Y-%m-%d'); end; grant execute on function DayBracket to public;
and execute select DayBracket("Expiry_Date") from table: exec time is 24s
even when i set the limit to 1 its taking the same time, so i guess it should be something related to loading the function.
The following function perform much better: CREATE FUNCTION DayBracketOpt(pdate date) returns char(10) BEGIN return extract(year from pdate) || '-' || lpad(extract(month from pdate),2,'0') || '-' || lpad(dayofmonth(pdate),2,'0'); end; grant execute on function DayBracketOpt to public;
I also tried to create a Python function: CREATE FUNCTION pyDayBracket(pdate date) returns string LANGUAGE PYTHON { from time import strftime, strptime return [strftime("%Y-%m-%d", strptime(pdt,"%Y-%m-%d")) for pdt in pdate] }; it is taking too long and throwing an exception:buffer size mismatch PS: the pdate array type is detected in pythons as string not as date;
Also how to delete a function with dependency, I need to replace some functions which are used in others functions and views. Any flags to turn off dependency check before dropping?
Thank you.
_______________________________________________ users-list mailing list users-list@monetdb.org https://www.monetdb.org/mailman/listinfo/users-list
_______________________________________________ users-list mailing list users-list@monetdb.org https://www.monetdb.org/mailman/listinfo/users-list