2020-09-14 13:39发布
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
除了使代码易于阅读(如果正确实现)之外,在hana sqlscript中使用表变量是否会对单个SQL语句产生特定的性能影响?
没有可复制数据的代码示例实际上只是在谈论一些东西。 如果目标是弄清楚实际情况,那么不可避免的是要有完整的测试用例。
我当然可以为您提供我"认为","相信"和"假设"的内容,以及将在何种程度上影响性能,但是实际上可能会或可能不会。
如果可以的话,我的答复是
1)这些示例看起来像是无稽之谈。 如果是关于层次结构解析的,那么我建议改用HANA层次结构功能。 无论如何,此数据流图确实解析为一个执行的SELECT语句。 因此,在这里,除了使用SQLScript块引起的开销之外,我不会期望运行时特性有所差异。
2)SQLScript中的表变量不像您在其他编程语言中那样在"内存中的位置"。 相反,您可以将它们视为SQL块的"标签"(与普通SQL中的常用表表达式相比)。 在查询执行时,SQLScript解析标签并创建独立的数据流图-如果可能的话,这是有益的。 最终,执行的是SQL命令,以及这些命令是否创建中间结果集与表变量没有关系。因此答案是否定的,表变量不会产生额外的运行时开销(但在不同的表之间处理数据 SQLScript块/过程/函数可能...)。
关于这些理论示例,我能说的很多。 到目前为止,针对不同客户项目的常见实践表明,使用表变量可以在很大程度上使代码更清晰,并可以识别出现性能问题的位置和原因。
广泛的问题。 您能否提供要比较的具体示例?主要区别在于SQLScript具有自己的优化和数据流表示形式。 根据SQLScript块的实际执行参数,这可能导致实际执行的SQL语句大不相同。
案例1),例如:
T1 =从tab1选择*;
T2 =从T1的左外部联接tab2上选择T1。*,tab2.C2(T1.c = tab2.c);
T3 =选择T2。*,tab3.C3从T2左外部联接tab3上(T2.C = tab3.C);
T4 =从T3的左外部联接tab4上选择t3。*,tab4.C4(t3。C3 = tab4.c5);
Outtab =从T4中选择*;
情况2)例如:
Outtab =
选择tab1。*,tab2.C2,T3.c3,T3.c4
从tab1
(tab1.c。= tab2.c)上的左外部联接tab2
左外部联接
(
选择tab3.c,tab3。 c3,tab4.c4
从tab3的左外部联接tab4上(tab3.c3 = tab4.C5)
)为T3
打开(tab1.c = t3.c);
更精确地查询我的
1)案例1的sqlscript在执行时间方面是否优于案例2的sqlscript? (保留独立表块的情况以及代码结果块的并行执行和可重用性的可能性,这在我的情况1中没有发生
2)是否像情况1一样使用表变量会产生额外的运行时内存开销?
感谢Lars。 您的解释已经澄清了我的主要疑问。
最多设置5个标签!
没有可复制数据的代码示例实际上只是在谈论一些东西。 如果目标是弄清楚实际情况,那么不可避免的是要有完整的测试用例。
我当然可以为您提供我"认为","相信"和"假设"的内容,以及将在何种程度上影响性能,但是实际上可能会或可能不会。
如果可以的话,我的答复是
1)这些示例看起来像是无稽之谈。 如果是关于层次结构解析的,那么我建议改用HANA层次结构功能。 无论如何,此数据流图确实解析为一个执行的SELECT语句。 因此,在这里,除了使用SQLScript块引起的开销之外,我不会期望运行时特性有所差异。
2)SQLScript中的表变量不像您在其他编程语言中那样在"内存中的位置"。 相反,您可以将它们视为SQL块的"标签"(与普通SQL中的常用表表达式相比)。 在查询执行时,SQLScript解析标签并创建独立的数据流图-如果可能的话,这是有益的。 最终,执行的是SQL命令,以及这些命令是否创建中间结果集与表变量没有关系。
因此答案是否定的,表变量不会产生额外的运行时开销(但在不同的表之间处理数据 SQLScript块/过程/函数可能...)。
关于这些理论示例,我能说的很多。
到目前为止,针对不同客户项目的常见实践表明,使用表变量可以在很大程度上使代码更清晰,并可以识别出现性能问题的位置和原因。
广泛的问题。 您能否提供要比较的具体示例?
主要区别在于SQLScript具有自己的优化和数据流表示形式。 根据SQLScript块的实际执行参数,这可能导致实际执行的SQL语句大不相同。
案例1),例如:
T1 =从tab1选择*;
T2 =从T1的左外部联接tab2上选择T1。*,tab2.C2(T1.c = tab2.c);
T3 =选择T2。*,tab3.C3从T2左外部联接tab3上(T2.C = tab3.C);
T4 =从T3的左外部联接tab4上选择t3。*,tab4.C4(t3。C3 = tab4.c5);
Outtab =从T4中选择*;
情况2)例如:
Outtab =
选择tab1。*,tab2.C2,T3.c3,T3.c4
从tab1
(tab1.c。= tab2.c)上的左外部联接tab2
左外部联接
(
选择tab3.c,tab3。 c3,tab4.c4
从tab3的左外部联接tab4上(tab3.c3 = tab4.C5)
)为T3
打开(tab1.c = t3.c);
更精确地查询我的
1)案例1的sqlscript在执行时间方面是否优于案例2的sqlscript? (保留独立表块的情况以及代码结果块的并行执行和可重用性的可能性,这在我的情况1中没有发生
2)是否像情况1一样使用表变量会产生额外的运行时内存开销?
感谢Lars。 您的解释已经澄清了我的主要疑问。
一周热门 更多>