Stored procedures Sap HANA Graphscript-多行结果的性能下降

Stored procedures Sap HANA Graphscript-多行结果的性能下降,stored-procedures,sap,graph-theory,breadth-first-search,hana,Stored Procedures,Sap,Graph Theory,Breadth First Search,Hana,在使用HANA图形脚本时,我遇到了存储过程性能的显著下降 我的任务如下-我正在使用HANA SP03的标准BFS功能在图形上进行BFS遍历。我的图表非常密集,结果很容易达到几行或几千行 CREATE PROCEDURE "MY_PROC" (IN word VARCHAR(100), IN category VARCHAR(100), OUT res "RESULT" DEFAULT EMPTY) LANGUAGE GRAPH READS SQL DATA AS BEGIN Graph

在使用HANA图形脚本时,我遇到了存储过程性能的显著下降

我的任务如下-我正在使用HANA SP03的标准BFS功能在图形上进行BFS遍历。我的图表非常密集,结果很容易达到几行或几千行

CREATE PROCEDURE "MY_PROC" (IN word VARCHAR(100), IN category VARCHAR(100), OUT res "RESULT" DEFAULT EMPTY) LANGUAGE GRAPH READS SQL DATA AS BEGIN Graph g = Graph("SCHEMA1","MYGRAPH"); Multiset filteredEdges = Multiset(:g); TRAVERSE BFS :g FROM Vertex(:g, :word) ON VISIT EDGE (Edge e) { Vertex sourceV = SOURCE(:e); IF (:sourceV."WORD" != :word) { filteredEdges = :filteredEdges UNION {:e}; } }; --copy all results into output object res = SELECT :e."TARGET", :e."CATEGORY_ID" FOREACH e IN :filteredEdges; END; 创建过程“MY_PROC”(在单词VARCHAR(100)中,在类别VARCHAR(100)中,OUT res“RESULT”默认为空) 语言图将SQL数据读取为 开始 图g=图(“SCHEMA1”、“MYGRAPH”); Multiset filteredges=Multiset(:g); 从顶点(:g,:word)遍历BFS:g 访问边缘(边缘e){ 顶点源v=源(:e); 如果(:sourceV.“WORD”!=:WORD){ filteredges=:filteredges联合{:e}; } }; --将所有结果复制到输出对象中 res=在:filteredges中为每个e选择:e“TARGET”,e“CATEGORY_ID”; 结束; 我将返回一个表类型并使用以下语句,这几乎是教程中最简单的语句:

在我的环境中,准备结果需要10秒钟,这显然是不可接受的。我已经测试了其他部分组合的运行时间,最高可达数十毫秒。在结果收集只有数百条记录的情况下,运行时间变得适中—100-200毫秒

有没有其他更快的方法从图形脚本返回数千个数据?我在实施过程中有很多自由,所以我会考虑任何可行的方法。我需要的in-OUT参数是顶点和边的一些属性的集合


提前感谢

我想我得到了答案,感谢SAP HANA团队成员

有几个关键想法: -使用子图将初始图缩小到可能的最小子图 -通过邻居使用自定义BFS,而不是标准的遍历BFS,只需设置足够大的限制即可 -如果逻辑允许,请使用UNION ALL而不是UNION—这样更快

所以最初的过程会变成这样。系统的性能飙升至数十毫秒:

CREATE PROCEDURE "MY_PROC" (IN word VARCHAR(100), IN category VARCHAR(100), IN is_direct_category BOOLEAN, OUT res "TARGET_CATEGORY_RESULT" DEFAULT EMPTY)
LANGUAGE GRAPH READS SQL DATA AS
BEGIN
    Graph  = Graph("SCHEMA1","MYGRAPH");
    Vertex startV = Vertex(:g_all, :word);
    Multiset<Vertex> m_reachable= NEIGHBORS(:g_all, :startV, 0, 100);
    Graph g = Subgraph(:g_all, :m_reachable);
    if (:is_direct_category == TRUE) {              
        Multiset<Edge> properEdges = e in Edges(:g) where :e."CATEGORY_ID" == :category;
        Graph res_g = Subgraph(:g, :properEdges);
        Multiset<Edge> e_res = Edges(:res_g);       
        res = SELECT :hypoEdge."TARGET", :hypoEdge."CATEGORY_ID" FOREACH hypoEdge IN :e_res;
    } else {
        Multiset<Edge> e_res = Edges(:g);       
        res = SELECT :hypoEdge."TARGET", :hypoEdge."CATEGORY_ID" FOREACH hypoEdge IN :e_res;
    }   
END;
CREATE PROCEDURE“MY_PROC”(在word VARCHAR(100)中,在category VARCHAR(100)中,在is_direct_category BOOLEAN中,OUT res“TARGET_category_RESULT”默认为空)
语言图将SQL数据读取为
开始
图=图(“SCHEMA1”、“MYGRAPH”);
顶点startV=顶点(:g_all,:word);
Multiset m_reachable=邻居(:g_all,:startV,0100);
图g=子图(:g_all,:m_可达);
如果(:is_direct_category==TRUE){
边(:g)中的Multiset Propedges=e,其中:e.“CATEGORY_ID”==:CATEGORY;
图res_g=子图(:g,:properEdges);
多集e_res=边(:res_g);
res=选择:hypoEdge.“TARGET”,:hypoEdge.“CATEGORY\u ID”FOREACH hypoEdge IN:e\u res;
}否则{
多集e_res=边(:g);
res=选择:hypoEdge.“TARGET”,:hypoEdge.“CATEGORY\u ID”FOREACH hypoEdge IN:e\u res;
}   
结束;