为什么Oracle与HANA的连接使用绑定变量工作得更快
从Oracle到SAP HANA(通过Oracle网关)的连接出现问题。在executeimmediate中使用绑定变量时,SQLs的工作速度比在执行标准SQLs时快得多 F.e.: 运行时间:96.808秒为什么Oracle与HANA的连接使用绑定变量工作得更快,oracle,variables,bind,gateway,hana,Oracle,Variables,Bind,Gateway,Hana,从Oracle到SAP HANA(通过Oracle网关)的连接出现问题。在executeimmediate中使用绑定变量时,SQLs的工作速度比在执行标准SQLs时快得多 F.e.: 运行时间:96.808秒 declare v_test number; begin execute immediate 'select count (1) from SYNONYM_TO_HANA_TABLE where field= :a' into v_test using '1234'; dbms
declare
v_test number;
begin
execute immediate 'select count (1) from SYNONYM_TO_HANA_TABLE where field= :a' into v_test using '1234';
dbms_output.put_line('return: ' || v_test);
end;
/
运行时间:0.179秒
基本上,两个SQL都返回相同的结果,但也许有人能够解释为什么执行时间之间存在如此大的差异。谢谢
Piotr找出这些查询的处理方法。 第一步可以是比较执行计划
select /* my_query1 */ count(1) from SYNONYM_TO_HANA_TABLE ;
declare
begin
execute immediate 'select /* my_query2 */ count(1) from SYNONYM_TO_HANA_TABLE ';
end;
/
select sql_id,sql_text from v$sql where sql_text like '%my_quere%' ;
select * from table(dbms_xplan.display_cursor('sql_id',0,'ALL'));
这些问题的顺序是什么?首先是普通sql,然后是ExecuteImmediate。我尝试了这两种方法-使用ExecuteImmediate重新连接并执行,而不使用ExecuteImmediate;使用e.i.重新连接并执行w/o e.i.。始终执行即时操作比不使用绑定变量的SQL快得多。在您发布的代码中,执行即时操作示例从不将结果分配给变量。是否只是跳过了执行?如果不是这样的话,那么跟踪这些调用,看看会向SAP HANA发送什么,以及不同的步骤(准备、执行、获取)需要多长时间呢?关于分配,您是对的,这在post中是错误的。我已经用executeimmediate编辑了post并更正了sql。是否有可能在没有DBA的情况下对此进行跟踪?我没有系统权限。我没有访问该域的权限:(不带bind变量的corpo安全策略查询正在将数据获取到oracle站点,而带bind变量的corpo安全策略查询在HANA站点执行。这不是执行计划所说的。即使在某个情况下过滤条件不会传递给HANA,它也不会解释时间差,因为结果集仍然是一条记录。Lars你能告诉我吗关于基于这些查询计划的长执行时间?抱歉,第一次没有看到远程SQL部分。看起来Oracle没有按下COUNT(*)聚合并实际获取记录…显然它也没有按下文字过滤器…不知道是否/在何处可以修改此行为。
select /* my_query1 */ count(1) from SYNONYM_TO_HANA_TABLE ;
declare
begin
execute immediate 'select /* my_query2 */ count(1) from SYNONYM_TO_HANA_TABLE ';
end;
/
select sql_id,sql_text from v$sql where sql_text like '%my_quere%' ;
select * from table(dbms_xplan.display_cursor('sql_id',0,'ALL'));