- - PR -
Oracle10g グループごとに連番を振りたい
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-07 10:02
いつもお世話になってます。
以下のような構造のデータがあるとき
COL1列ごとにグループ化させて、COL2列に以下のように連番を振り直そうと考えてます。
そこで、『おらくる虎の穴掲示板』に書いてあったSQLを参考に、
このようなSQLを作成したのですが、 このSQLで、役10万件のデータの更新をしようとすると、応答がなくなってしまいました。 更新しようとするデータは最大で100万件程度になることもあるようで、 現状のSQLよりも、もっとレスポンスの良い書き方がないものかと思い 色々と調べてみたのですが、先の参照元URLよりも良さそうなSQLが見つかりません。 現状のSQLよりも、レスポンスの良いSQLの書き方 もしくは、その参考になりそうなURLをご存知であれば、 ご教授願いたく投稿させていただきました。 皆様のお知恵を拝借させていただけると、さいわいです。 よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2006-12-07 10:29
とりあえず 実行計画を取ってみて そこから判断しましょう。
| ||||||||||||
|
投稿日時: 2006-12-07 10:31
RANK関数を使えばどうでしょうか?
select COL1 , COL2 , rank() over (partition by COL1 order by COL2) rank from TABLE1 みたいな感じです | ||||||||||||
|
投稿日時: 2006-12-07 11:13
七味唐辛子さん>
さっそくの返信ありがとうございます。 実行計画とは、オブジェクトブラウザの『SQL 実行』ウィンドウにある [実行計画]で見られる情報のことでしょうか? 表示される情報の意味が分からないので、調べつつ調べ(微妙な言い回しですね・・)て みようと思います。 [ メッセージ編集済み 編集者: ぺどら 編集日時 2006-12-07 11:14 ] | ||||||||||||
|
投稿日時: 2006-12-07 11:24
PoHさん>
さっそくの返信ありがとうございます。 例文まで書いていただき、非常に感謝しています。 RANK関数というのを初めて目にしたので、使い方が正しいかわかりませんが
というSQLを作成し、実験したところ 以前のSQL(『おらくる虎の穴掲示板』バージョン)よりも遅くなってしまいました・・ オブジェクトブラウザの『SQL 実行』ウィンドウより実行した場合の処理時間ですが、 以前のSQLの場合(データ件数:500件)、00:00:00 今回のSQLの場合(データ件数:500件)、00:00:26 という結果でした。 RANK関数の使い方はこれで正しいのでしょうか・・? 連番だけを表示させた場合(UPDATEを外して実験)、 以前のSQLより、RANK関数を使ったものの方が早かったのですが。 | ||||||||||||
|
投稿日時: 2006-12-07 11:55
自分の作ったSQLと、PoHさんから教えて頂いたRANK関数を使ったSQLを
七味唐辛子さんから教えて頂いた、実行計画を表示させて比較してみました。
結果、以前のものとRANK関数使用バージョンでは 『consistent gets』が後者の方が10倍程度多い以外は、 後者の方が全体的な数値は低かったです。 なのに、更新時は前者の方がレスポンスが速い・・ もうちょっと実行計画というものの見方を調べてみようと思います。 | ||||||||||||
|
投稿日時: 2006-12-07 12:41
こうすれば多少は早くなるかも
UPDATE TBL T1 SET T1.COL2 = ( SELECT SEQ.連番 FROM ( SELECT /*T1.COL1,*/ T1.ROWID AS キー, /*RANK()*/row_number() OVER (PARTITION BY T1.COL1 ORDER BY /*T1.ROWID*/1) AS 連番 FROM TBL T1) SEQ WHERE T1.ROWID = SEQ.キー ) ; | ||||||||||||
|
投稿日時: 2006-12-07 13:08
SQL文を見直しても変わらないなら
CREATE INSERTでWORKテーブルに一旦入れて そこから本番にDELETE、INSERTという手もありますが。。。 一時的な更新や夜間バッチであればいいですが 通常運用で使うならNGですねぇ SQL文だけでなくインデックスなどを 見直す必要もあるかもしれないので お力になりきれないですが、がんばってください | ||||||||||||
