stored-procedures - 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 参数中需要的是顶点和边的一些属性的集合。
提前致谢
解决方案
我想我得到了答案,感谢 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;
推荐阅读
- ag-grid - AgGrid:更改聚合标题名称
- python - Python:替换后仍有多个空格?
- redux-form - 表单提交后如何取消 react-final-form 验证?
- windows - 在四个 3840 x 2160 屏幕上自动打开和定位八个网页 (Windows 10)
- soap - C0000005 ACCESS_VIOLATION 异常与 Progress Openedge 调用 Web 服务时
- python - 通过“文件名”检索 GridFS 文档的文档“_id”
- javascript - 我们如何在打字稿中创建带有前缀/后缀单词的字符串类型?
- excel - 如何在excel中将a+bi表单数据更改为复数?
- mysql - 在远程主机上执行 mysql 查询时转义 mysql 密码中的特殊字符
- forms - 如果未选中复选框(= 请求为空),则不处理 Symfony 表单