0

OracleでDBリンクを使用する接続のために、距離のあるサーバーからデータを取得する必要があります。単純な選択クエリの実行には約 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) で記述されたサービスを使用します。local_listまず、ローカル テーブルからデータを受け取り (おそらく 20 ミリ秒かかりました)、 pro*c (for および string 操作) を使用してリストをいくつかの varchar 変数に作成します。このリストには直接データが含まれています fe:('001','002',...,'003','020')
次に、外部テーブルからデータを取得するためのクエリを実行します

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

結果は、元のクエリ (6 秒) よりもはるかに高速です。

長い間うまく機能していましたが、PL/SQL プロシージャを使用してこれを行うには、db で直接バッチ ジョブを作成する必要があります。PL/SQLでこの種類のリストを作成する方法はありますか? または、元の取得クエリを高速化しますか?

4

2 に答える 2

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 に答える