dポイントプレゼントキャンペーン実施中!

夜間処理で
テーブル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つ

A 回答 (2件)

こんにちわ。



処理件数が多そうなので、INSERT ~ SELECT 文をX.CODE_B の値で8分割
(CPU数×2) 位に分割して多重で処理させてみてはどうでしょう?
空きブロックの獲得で競合が発生しないように、Freelist の調整を忘れないで下さい。
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
これを試してみようと思います。

今は
INSERT /*+PARALLEL APPEND */ INTO ALARM_B NOLOGGING

でかなり速くなり、とりあえずお茶を濁しています。

お礼日時:2006/03/23 13:27

OSさえも書いていないので回答はできないので、ポイントについて。



・CPU の使用率
・I/O 状況 (Unix 系の場合は iostat)
・statspack で取得できる Top 5 待機イベント
・statspack で取得できる各データファイルへのアクセス状況
・SQL トレースの結果
・ディスク本数
・テーブルに対する索引の有無

このあたりが最初にチェックすべきポイントでしょう。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す