• ベストアンサー

大量データの取得処理について

テーブル1のレコードを全件取得し、取得したレコードの特定の項目を一件ずつチェックし、テーブル2の値を更新する処理を考えています。 しかし、テーブル1のレコード数が8万件存在するため、一気に全件を取得するのはまずいことになるのではと危惧しています。 そこで、fetch first ~ rows を使用するため、テーブル1に項目を追加し、更新が済んだらその項目にフラグを立てるような処理も考えましたが、 たった一度の処理のためにテーブルに項目を追加するのもどうかなと思っています。 1000件くらいずつ順番に取得できる良い方法があったら教えてください。 よろしくお願い致します。 ちなみにデータベースはDB2を使用しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • ishi00
  • ベストアンサー率83% (10/12)
回答No.1

rownumber() over() を使えばできると思います。 例えば、hogeテーブルの、1件目から1000件目までを取得するには次のようなSQL SELECT t.cl1,t.rownum FROM (SELECT cl1,rownumber() over (ORDER BY cl2) as rownum FROM hoge) AS t WHERE rownum between 1 and 1000 ORDER BY rownum 1001件目から2000件目までを取得するには次のようなSQL SELECT t.cl1,t.rownum FROM (SELECT cl1,rownumber() over (ORDER BY cl2) as rownum FROM hoge) AS t WHERE rownum between 1001 and 2000 ORDER BY rownum ・・・というように。 ただし、ここでは cl2 で ORDER BY した結果に番号を振っています。 2回のSQLが思い通りに行くためには ORDER BY した結果が常に同じである必要があると思います。 hogeテーブルの全ての項目で ORDER BY すれば間違いないということになると思います。

taaar
質問者

お礼

返信が遅くなってしまってすみません。 ものすごく複雑なSQLですね。 ROWIDらしきものを作成するということでしょうか。 参考にしてやってみます。 ありがとうございました。

その他の回答 (2)

noname#182251
noname#182251
回答No.3

条件にマッチした時だけ「テーブル2の値を更新する」わけですから、その条件で絞り込んだ(SQL文を書いた)方が処理が速いのでは?

taaar
質問者

お礼

返信が遅くなってしまいましてすみません。 おっしゃるとおり条件で絞り込んだ方がいいのですが、理由がありまして全件処理をしなくてはならないのです。 ご意見ありがとうございました。

  • tabikin
  • ベストアンサー率62% (5/8)
回答No.2

SELECT TOP 1000 ~(以下SQL文) としてSQL文を発行すれば、1000件取得出来ますよね? 1000件ずつ8万件(最終レコード)までカウントアップするループ文を作成し、その中でカーソルを回して更新処理を1000件行えばいいんじゃないんでしょうか?

taaar
質問者

お礼

返信が遅くなってしまってすみません。 SELECT TOP で1000件ずつ取得できるのかどうか試してみます。 ご意見ありがとうございました。

関連するQ&A