- ベストアンサー
insertの高速化?
夜間処理で テーブルX(明細表)とテーブルY(コード表)を 結合(直積)してテーブルZ(結果表)へ挿入する処理が 現在20分かかるので、高速化したいと思っています。 何か良い知恵を教えてください。 下記の例で、項目CODE_Dは項目CODE_Bの集計先のようなキーで テーブルXの情報に 項目CODE_Dを編集することで 検索性能を向上させる目的があります。 SQLの時間のかかるポイントは (1)SELECT時に直積を作成する個所 (2)インサート と思っており、そこを速くできれば効果があるのかもしれません。 各テーブルにある項目CODE_Aは2値しかとらないので 項目CODE_Aをキーにしてパーティション化しようかとも考えていますが 効果があるのかどうか悩んでいます。 ■例 [入力] ・テーブルX(明細表) 7万件 項目 CODE_A, CODE_B, CODE_C, DATA_Z ・テーブルY(コード表) 37万件 項目 CODE_A, CODE_B, CODE_D [出力] ・テーブルZ(結果表) 340万件 項目 CODE_A, CODE_B, CODE_C, CODE_D, DATA_Z [SQL文] INSERT INTO Z NOLOGGING SELECT X.CODE_A, X.CODE_B, X.CODE_C, Y.CODE_D, X.DATA_Z FROM Y, X WHERE Y.CODE_A = X.CODE_A AND Y.CODE_B = X.CODE_B [環境等の条件] ・ORACLEのバージョン 9.2.0.1 ・parallel_max_servers 16 ・redoやundo表領域、テーブル表領域は十分にメンテナンスされている ・ディスクは RAID5で、たくさんのメモリを搭載 ・CPU数は4つ
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわ。 処理件数が多そうなので、INSERT ~ SELECT 文をX.CODE_B の値で8分割 (CPU数×2) 位に分割して多重で処理させてみてはどうでしょう? 空きブロックの獲得で競合が発生しないように、Freelist の調整を忘れないで下さい。
その他の回答 (1)
- entree
- ベストアンサー率55% (405/735)
OSさえも書いていないので回答はできないので、ポイントについて。 ・CPU の使用率 ・I/O 状況 (Unix 系の場合は iostat) ・statspack で取得できる Top 5 待機イベント ・statspack で取得できる各データファイルへのアクセス状況 ・SQL トレースの結果 ・ディスク本数 ・テーブルに対する索引の有無 このあたりが最初にチェックすべきポイントでしょう。
お礼
どうもありがとうございます。 これを試してみようと思います。 今は INSERT /*+PARALLEL APPEND */ INTO ALARM_B NOLOGGING でかなり速くなり、とりあえずお茶を濁しています。