2016-04-21 11 views
-3

私は1つのUNIXスクリプトを持っています これでは、SQLローダを使用してテーブル、インデックスを作成し、ファイルからこのテーブルに日付をロードしています。 この表では、70回近くの直接更新(全部または大量収集を使用しない)を行っています。パフォーマンスチューニング - 挿入

最後に、この新しいテーブルのデータを別のテーブルに挿入しています。 1日あたり500,000レコードを処理しています。これらのアップデートはすべて非常に高速です。

このデータを20分かけて別のテーブルに挿入するとき。どのように改善することができますか?

  1. 同じテーブルで、正常に動作している別のテーブルから500,000個のレクタを挿入しているため、挿入に問題はありません。挿入は1分以内で完了しました。

テーブルへの挿入select()from tablex; 500000レコードで20分かかります 同じシェルスクリプトでテーブルが作成され、読み込まれ、70直接更新されました。

selectスクリプトとinsertスクリプトの両方の実行計画コストが同じであることを確認しました。

テーブルに挿入する()select()from tabley; 上記の文は1秒未満で実行されました。

  • パラレルヒントを使用しました。コストが削減されます。そしてCPU使用率はゼロです。
  • もう1つのテーブルtablezを作成し、tablezから最終テーブルにデータをロードしますか?
  • 統計収集が必要ですか?これは毎日実行されるプログラムです。
+1

ステップ1 - [ask]を読んでください。 – OldProgrammer

答えて

0

SQL Loaderを使用して直接パスを挿入すると、レコードはHighWaterMarkの上に挿入されます。ロードが完了し、HighWaterMarkが上に移動すると、元の/古いHighWaterMarkの位置の下に空のブロックがたくさんある可能性があります。あなたのSELECTがフルテーブルスキャンの場合、空のブロックもすべて読み込みます。あなたのテーブルに一定期間にわたって多くの空のブロックが蓄積されているかどうかを確認してください。このためにセグメントアドバイザーを使用することができます。アドバイザーの推奨事項に基づいて、テーブルを縮小し、未使用の空き領域を解放します。これは実行をスピードアップする可能性があります。お役に立てれば。

+0

お返事ありがとうございます。 Imテーブルの作成、SQL Loaderを使用した1回の挿入、ビジネスロジック実装のための多くの更新このテーブルから別のテーブルに投稿してください。私はここにテーブルを作成しているので、空のブロックには何の問題もないと思います。 – VIDHYA

+0

入手しました。親切に以下の詳細を確認してください。 1. GBのテーブルXとテーブルYのサイズはどのくらいですか? 2.テーブルXとテーブルYからの選択の実行計画に違いはありますか? 3.上記の1と2が同じ場合は、テーブルXに挿入する間に他のプロセスがI/OまたはCPUを枯渇していないかどうかを確認します。AWRまたはOEMまたは動的パフォーマンスビューを使用して、それはそうです。 これが役に立ちます。ありがとう。 – ArtBajji