2

Oracleテーブルからファイルにデータをコピーする必要がありました。

800kレコードをフェッチする結合クエリがあるので、row_number()関数とorder by句を使用して、それぞれ200kを含む4つのファイルを生成しました。

クエリ:

SELECT * FROM (
    SELECT  ROW_NUMBER() OVER ( order by FILE_KEY desc ) rn,
        FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO = rout.FILE_KEY) 
WHERE rn BETWEEN start AND end;

パラメーター:

For 1st File  : start =1 ,end = 200000
For 2nd File  : start =200001 ,end = 400000
For 3rd File  : start =400001 ,end = 600000
For 4th File  : start =600001 ,end = 800000

しかし、SQLクエリブラウザでこのクエリを使用して最後の10行をチェックしたところ、ファイルの最後の10行が異なります。つまり、ファイルとSQLクエリブラウザでシーケンスが異なります。

SELECT * FROM (
    SELECT  ROW_NUMBER() OVER(  order by FILE_KEY desc ) rn,
        FILE_KEY,ROUTING_NO,INTLROUT_TYPE,ABBR_COUNTRY_CODE_2D,HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO=rout.FILE_KEY) 
WHERE rn BETWEEN 709990 AND 80000;
4

3 に答える 3

1

これは、あなたがこのようなものを持っているからかもしれません

row_number file_key 
799998     same_number
799999     same_number
800000     same_number
800001     same_number
800002     same_number
800003     same_number
800004     same_number

file_key で注文するためです。

異なるデータであることをどのように観察しましたか? 他の列から。したがって、次を使用できます。

SELECT  ROW_NUMBER() OVER(order by FILE_KEY desc, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO ) rn

または (2 番目の原因)、クエリ間でベース テーブルが変更されました。

UDPDATE :use_hashヒントを使用してクエリを高速化できます。このクエリには 5 時間は多すぎます。

SELECT * FROM (
    SELECT  /*+use_hash(rout loc)*/
        ROW_NUMBER() OVER(order by FILE_KEY desc, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO ) rn,
        FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO = rout.FILE_KEY) 
WHERE rn BETWEEN start AND end;
于 2012-01-04T09:15:01.240 に答える
1

over 句では、BANK_INTL_LOC_TBL の一意のフィールドで並べ替えます。

SELECT * FROM (
    SELECT  ROW_NUMBER() OVER ( order by loc.**LOC_KEY** desc ) rn,
        FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
    FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
    WHERE loc.CATALOG_NO = rout.FILE_KEY) 
WHERE rn BETWEEN start AND end
ORDER BY rn;

UPDATE : @Shannon Severance コメントによると
、order by 句を追加します

于 2012-01-04T09:20:15.357 に答える
0

Oracle のインストールにディスクに余裕がある場合 (そうするべきです!)、内部クエリを 4 回実行する代わりに、以下を実行する方が高速になる場合があります。

CREATE TABLE bank_data
NOLOGGING
PARALLEL 4
AS SELECT  ROW_NUMBER() OVER ( order by FILE_KEY desc ) rn,
    FILE_KEY, ROUTING_NO, INTLROUT_TYPE, ABBR_COUNTRY_CODE_2D, HO_CATALOG_NO 
FROM BANK_INTL_ROUT_TBL rout, BANK_INTL_LOC_TBL loc 
WHERE loc.CATALOG_NO = rout.FILE_KEY);

使用する並列処理の量 (4ここでの私の例の数) は、データベースが処理できる同時作業の量に依存し、主に CPU の数に依存します。

それが終わったら (明らかに 5 時間もかからないはずです!)、bank_dumpテーブルで単純な選択を実行して、必要なレコードを取得できます。

SELECT *
FROM bank_dump
where rn < 200000

たとえば、最初のデータセットの場合。

于 2012-01-04T16:38:35.957 に答える