0

我需要从某个远程服务器获取数据,我在 Oracle 中使用 DB Link 进行连接。执行一个简单的选择查询大约需要 6 秒。

这是按某个块(约 20 行)获取数据的示例,平均执行时间约为 25 秒:

select * from external_table et where et.pk in 
 (select lt.pk from local_table lt where condition) 

对于调用查询,我使用用 pro*c(T-Max) 编写的服务。首先,我从本地表接收数据(可能需要 20 毫秒)并local_list使用 pro*c(for 和字符串操作)将列表创建到一些 varchar 变量中。此列表直接包含数据 fe:('001','002',...,'003','020')
然后我执行查询以从外部表中检索数据

select * from external_table et where et.pk in **local_list**

结果比原始查询快得多(6 秒)。

它工作了很长时间,但现在我需要直接在 db 中创建一些批处理作业来使用 PL/SQL 过程来做到这一点。有什么方法可以在 PL/SQL 中创建这种列表吗?或者加快原始检索查询?

4

2 回答 2

1

由于您的本地表具有您对外部表感兴趣的键,我建议您只使用标准连接:

SELECT * 
     FROM EXTERNAL_TABLE ET
     INNER JOIN LOCAL_TABLE LT
      ON ET.PK = LT.PK
 WHERE (<put any criteria in here for your local table>);

或者:

SELECT * 
     FROM EXTERNAL_TABLE ET LOCAL_TABLE LT          
 WHERE ET.PK = LT.PK AND
       (<put any other criteria in here for your local table>);

我不确定在这种情况下子查询是否有很大帮助。

于 2013-07-29T17:28:09.083 回答
0

加入可以帮助速度是一样的,但最后我找到了我的问题的解决方案,动态 sql。

select 'SELECT * FROM EXTERNAL_TABLE ET WHERE ET.PK IN '
INTO SELECT QUERY FROM DUAL;  
PK_LIST:='('    
 FOR C_LIST IN(    
  SELECT PK FROM local_table where some_condition)    
 LOOP    
  if PK_LIST= '(' THEN
   SELECT PK_LIST||'''' ||C_LIST.PK|| ''''    
    INTO PK_LIST   
   FROM DUAL;   
  ELSE    
   SELECT PK_LIST||',''' ||C_LIST.PK|| ''''   
     INTO PK_LIST    
     FROM DUAL;   
  END IF ;   
 END LOOP;
SELECT PK_LIST||')'  
  INTO PK_LIST   
  FROM DUAL;            
SELECT SELECT_QUERY || PK_LIST    
  INTO MAIN_QUERY   
  FROM DUAL;     
EXECUTE IMMEDIATE MAIN_QUERY;  

抱歉格式化,但我很着急,结果是 2 - 4 秒 :),这比我预期的要好。我在某处看到有关不使用动态 sql 的信息,但我没有其他选择。我在生产中节省了很多时间:)我还有其他建议,请写下来谢谢

于 2013-07-30T07:32:16.663 回答