0

これは私を困惑させます。DB2 自体からのプルは高速であり、テーブルからのプルも高速ですが、それらがうまく連携しない理由はわかりません。DB2 テーブルまたはそこにあるサーバーのインデックスにアクセスできません。

このクエリには 0.017 秒かかります。

select
    PART_NO, 
    APRV_DT, 
    round((CURRENT_DATE - APRV_DT)/365.242199,1) as AGE,
    rank() over (partition by PART_NO order by APRV_DT asc) rnk,
    FROM DB2_TABLE
where PART_NO in 
    ('529711',
    '627862',
    '325712',
    '979257',
    '168570',
    '004297')

20 万近くの部品番号を照会する必要があるため、すべての部品番号をハードコーディングしたくないことは明らかです。

これを機能させるために、ここに部品番号を残しました。同じ 6 つの部品番号を選択するこのクエリには、1.23 秒かかります。

select distinct PART_NUMBER from PARTS_REPORT
where PART_NUMBER in 
    ('529711',
    '627862',
    '325712',
    '979257',
    '168570',
    '004297')

問題は、これらを組み合わせる場合です。

私の考えでは、このクエリには約 3 秒程度かかるはずです。492 秒かかります。

select
    PART_NO, 
    APRV_DT, 
    round((CURRENT_DATE - APRV_DT)/365.242199,1) as AGE,
    rank() over (partition by PART_NO order by APRV_DT asc) rnk,
    FROM DB2_TABLE
where PART_NO in 
(
  select distinct PART_NUMBER from PARTS_REPORT
   where PART_NUMBER in 
       ('529711',
       '627862',
       '325712',
       '979257',
       '168570',
       '004297')
  )

これを行うより良い方法はありますか?PARTS_REPORT テーブルにインデックスを付ける必要がありますか? ここでの鍵は何ですか?

編集: 200k っぽい部品番号をすべて実行するには、同じクエリに 564 秒かかります。これは、上記の実行にかかる時間とほぼ同じです。

編集 2: 以下のユーザーは、何が起こっているのかを知るのに役立ちました - リモートテーブル全体をプルダウンする必要があり、それは遅いです。今何が起こっているのか理解できたと思います - ありがとう。

4

1 に答える 1

2

私のコメントを答えとして要約すると:

最初のクエリではIN、クエリに明示的なリストを提供しているため、リモートで DB2 サーバー上で全体が実行され、 からデータが返されDB2_TABLEます。

ローカル テーブルから検索基準を取得しようとすると (これは で行いますwhere PART_NO in)、リモート テーブルとローカル テーブルの結合を強制します。この場合、結合が実行されるローカル サーバーにリモート テーブル全体を送信する必要があります。

ローカル テーブル (またはそのサブセット) をリモート サーバーに送信してそこで結合を実行すると、必要な帯域幅が少なくなる可能性があります。これを実現するには、一時テーブルを宣言し、Oracle テーブルから部品番号のリストをロードしてから、2 つのリモート テーブルに対してクエリを実行し、そこで結合をローカライズします。

リモート データベースで、そのテーブルをクエリできるいくつかの特権を既に持っています。実行できるかどうか試してみてください。DECLARE GLOBAL TEMPORARY TABLEデフォルトでは、通常の権限を超える権限は必要ありませんPUBLIC

于 2017-10-06T16:22:09.747 に答える