假设以下查询结构,这三个选项之间的性能是否不同:
CREATE PROCEDURE SCHEMA.PROC
BEGIN
TEMP = SELECT * FROM A JOIN B JOIN C;
INSERT INTO TABLE (TEMP);
END;
选项1:
STRING_OF_PROC = 'CALL SCHEMA.PROC()';
EXECUTE IMMEDIATE (STRING_OF_PROC);
选项2:
CALL SCHEMA.PROC();
选项3:
EXECUTE IMMEDIATE ( TEMP = SELECT * FROM A JOIN B JOIN C;
INSERT INTO TABLE (TEMP); );
如果不同的RDBMS之间存在差异,那么我在SAP HANA空间中工作。
好吧,这个问题很模糊,所以我的答案将仅描述不同的选择以及随之而来的内容。
选项0:这是一个执行SELECT并尝试将结果插入表中的存储过程。
选项1:准备了一个包含CALL procedure()
文本的字符串,然后将该字符串与动态SQL执行EXECUTE IMMEDIATE
一起使用。
选项2:直接调用该过程。
选项3:带有SQLScript命令块的EXECUTE IMMEDIATE
调用。
广告选项3根本无法使用,并且会导致错误,因为EXECUTE IMMEDIATE
需要命令字符串。该命令字符串必须是正确的SQL,在这里不是这种情况。另外,它只能是单个命令,而不能是多个命令的列表。
作为选项1和2:从性能的角度来看,这些几乎是相同的。显然,动态SQL选项需要额外的解析,并且可能导致共享SQL缓存中出现其他条目,但这在过程调用的整个运行时中应该忽略不计。
BTW:选项0中的过程也不起作用-在某些地方,该过程在语法上是错误的。
底线:动态SQL调用与直接调用不带参数或返回值的单个过程的性能之间的差异可以忽略不计。