0

私は現在、アカデミックベンチマークであるTPC-Hを実行しており、ダイレクトパス(非常にうまく機能し、非常に高速でした)と従来のパスを使用してロードしたいいくつかの大きなテーブルがあります。

そのために、私はこのバッチスクリプトを使用しました:

for /F "tokens=1,2" %%A in (table4_records.txt) do (
sqlldr userid='tpch/tpch' control=%%A.ctl rows=%%B bindsize=? readsize=? SILENT=HEADER log=bulkload_logs\sf4\bulk_%%A%1.log
)

問題は、bindsizeやreadsizeオプションにどのような値を指定しても、常に65534から65534の行にコミットすることです。テーブルごとの正確な行数である%%Bサイズをすでに渡しました。

直接ロードでは、ホールテーブルがロードされた後に実際に行われたように行とコミットを使用しました。

私はそのようなことをしたいのですが、従来のロードパスでは、それが速くないことはわかっていますが、それがポイントです。

正しいパラメータを指定して、次のことができるようにする方法を教えてください。1-一度にできるだけ多くのデータをロードする。
2-コミットの頻度を減らし、できればテーブルのロードの最後にコミットします。

テーブルの名前と行数は次のとおりです。

lineitem 23996604->が最大で、約があります。ディスク上の3GBの
注文6000000
パーツアップ3200000
パーツ800000
顧客600000
サプライヤー40000
国25
地域5

4

3 に答える 3

0

従来のパスロードを使用して最後にコミットする3GBのファイルを取得することはできません。Oracleドキュメントから:

「SQL*LoaderがOracleデータベースにINSERTコマンドを送信すると、配列全体が一度に挿入されます。バインド配列の行が挿入された後、COMMITステートメントが発行されます。」

「従来のパス方式では、バインド配列は読み取りバッファーのサイズによって制限されます。したがって、読み取りバッファーが大きいことの利点は、コミット操作が必要になる前に、より多くのデータを読み取ることができることです。」

プラットフォームの最大値に達したことが示されるまで、READSIZEとBINDSIZEを最大化します。

于 2011-03-23T23:04:43.377 に答える
0

おっと:

従来のパスでのROWSの最大数は正確に65534であることが判明したため、bindarrayサイズを増やし続けることができました。笑

申し訳ありませんが、Oracleのドキュメントで見つけました

于 2011-03-29T04:40:22.627 に答える
-1

Burlesonのサイトにはこれを行うための可能な方法があります

于 2011-03-23T15:02:57.950 に答える