首页 > 解决方案 > Sap HANA Graphscript - 多行结果的性能下降

问题描述

使用 HANA Graph 脚本时,我遇到了存储过程的显着性能下降。

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

CREATE PROCEDURE "MY_PROC" (IN word VARCHAR(100), IN category VARCHAR(100), OUT res "RESULT" DEFAULT EMPTY)
语言图将 SQL 数据读取为
开始
    图 g = Graph("SCHEMA1","MYGRAPH");
    多集过滤边缘 = 多集(:g);
    遍历 BFS :g FROM Vertex(:g, :word)
        在访问边缘(边缘 e){
            顶点源V = SOURCE(:e);            
            IF (:sourceV."WORD" != :word) {
                filtersedEdges = :filteredEdges UNION {:e};  
            }
        };
    --将所有结果复制到输出对象中
    res = SELECT :e."TARGET", :e."CATEGORY_ID" FOREACH e IN :filteredEdges;

结尾;
 

我正在返回一个 TABLE 类型并使用以下语句,这几乎是教程中最简单的事情:

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

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

提前致谢

标签: stored-proceduressapgraph-theorybreadth-first-searchhana

解决方案


我想我得到了答案,感谢 SAP HANA 团队的人。

有几个关键思想: - 使用 Subgraph 将初始图缩小到可能的最小子图 - 通过 NEIGHBORS 使用自定义 BFS 而不是标准 TRAVERSE 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;

推荐阅读