Hello, we are experiencing a weird performance issue in function calling. In many xqueries we use, we found that calling functions slows down the execution, sometimes it even hangs "forever". I tried to drill down to the problem and I think I isolated an odd behavior. Before presenting the example code, let me summarize a little bit: inside a for-loop we call a thousand times a function passing some parameters. I declared 3 functions, 2 of which take 1 parameter and the last one takes 2 parameters. For simplicity's sake the parameter "objectId" is never used, but that doesn't affect the experiment. When I call any of the 1-parameter functions, execution takes less than 2 seconds, but when I call the 2-parameter function it runs endlessly. It seems that the combination of those two parameters is the point of performance issue. I hope you can illuminate me. Regards William
Here it is an example:
declare namespace xbpr = "http://www.bpeng.com/";
declare variable $amlDocName as xs:string :="aml"; declare variable $cxnDefsDocName as xs:string :="cxnDefsDocName";
declare function xbpr:testFast1($objectId as xs:string?){ let $docName := $cxnDefsDocName let $conn_typeof_target := doc($docName)/CxnDefs/CxnDef[@type="RdfsType"]/@target return $conn_typeof_target };
declare function xbpr:testFast2($docName as xs:string?){ let $conn_typeof_target := doc($docName)/CxnDefs/CxnDef[@type="RdfsType"]/@target return $conn_typeof_target };
declare function xbpr:testSlow($docName as xs:string?, $objectId as xs:string?){ let $conn_typeof_target := doc($docName)/CxnDefs/CxnDef[@type="RdfsType"]/@target return $conn_typeof_target };
let $instances := doc($amlDocName)/AML/Group//ObjDef for $instance in $instances let $objectId := $instance/@ObjDef.ID let $v := xbpr:testFast1($objectId) let $v := xbpr:testFast2($cxnDefsDocName) let $v := xbpr:testSlow($cxnDefsDocName, $objectId) return $v