2012-01-04 10 views
2

データをOracleファイルからファイルにコピーする必要がありました。ROW_NUMBER()は正しくレコードを順序付けしていません

私は200kを含む4つのファイルを生成するためにorder by節と共にrow_number()関数を使用して800kレコードをフェッチする結合クエリを持っています。

問合せ:

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; 
+0

どのテーブルがマスターであり、どのテーブルが詳細ですか? BANK_INTL_LOC_TBLが詳細である場合、同じFILE_KEYが結果セット内に複数回存在する可能性はありますか? –

+0

はいBANK_INTL_LOC_TBLは詳細でFILE_KEYは2回以上です –

+2

クエリで 'order by'句が指定されていないと、ファイルに書き込まれる行は' row_number() 'の順序とは異なる順序になる可能性があります。したがって、一意のキーを使用するように修正されたときに最後にクエリを実行すると、**ファイルの最後の10行が得られない場合がありますが、ファイルのどこかに10行しか存在しません。 –

答えて

1

あなたはfile_keyで注文するので、あなたがこの

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 

のようなものを持っているので、これはすることができます。

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

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

または(2番目の原因)、基本表がクエリー間で変更されています。

UDPDATEuse_hashヒントを使用してクエリを高速化できます。このクエリでは5時間が多すぎます。 OVER句、BANK_INTL_LOC_TBLで一意のフィールド順に

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; 
+0

Florin Ghitaありがとう、これをチェックして、あなたに連絡します。 –

+0

ありがとうフロリンとシャノン、私はこのクエリを使用し、シーケンスをチェックする代わりに、重複したレコードがあればそれがないかどうかをチェックするクラスを作成しました。 –

1

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退職のコメントによると
あなた場合句

+0

ありがとうABCade、これを試してみます.. –

+0

こんにちはAB、私はBANK_INTL_LOC_TBL主キーですが、クエリブラウザでFILE_KEYと同じ最後の10レコードシーケンスを示すCATALOG_NOを使用しましたので、CATALOG_NOに変更すると、 ? –

+0

@ neel.1708あなたは私のクエリで4つのファイルを生成しようとしましたか? –

0

順を追加あなたのオラクルのインストールで余分なディスクが必要です(これを実行する必要があります)。内部クエリを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の数にほとんど依存して、データベースが扱うことができますどのくらいの並行作業に依存します。

それは(noticably 5未満時間を取るべきである!)、終了した後、あなたがのために、あなたが最初のデータ・セットの

SELECT * 
FROM bank_dump 
where rn < 200000 

を望んでレコードを引っ張ってbank_dumpテーブルの上に簡単な選択を実行することができます例。

+0

ありがとうrejj、しかし、私はこのスキーマへの読み取りアクセス権があります:) –

関連する問題