C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: データを少しずつ抽出したい


(過去ログ 47 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■25223 / inTopicNo.1)  データを少しずつ抽出したい
  
□投稿者/ 鶏唐揚 (297回)-(2008/09/17(Wed) 09:49:55)

分類:[データベース全般] 

[VB]2003
[DB]Oracle 10g R2

お世話になっております
今回、Oracle10g+VBで、日毎タスク実行でDBからログを抽出しテキストに保存しています

ある日OutOfMemoryExceptionが発生するようになってしまいました
DBのログはテキスト保存後に削除しているので1日のログしか存在してないはずなのですが、
多いときには数十万件あったようでDataSetに一気に保持しようとして例外発生していたようです。

そこで、数件ごと抽出していく方法がないか調べていたところ、
http://blog.goo.ne.jp/cxq02162/e/c864c27234e2339bd1539e4b6e401d51
こちらで1件ずつ抽出できる方法が書かれていました。
しかしできればストアドプロシージャ?を使いたくないと思い、こちらに質問させていただきました

よろしくお願いします。
引用返信 編集キー/
■25225 / inTopicNo.2)  Re[1]: データを少しずつ抽出したい
□投稿者/ HiJun (104回)-(2008/09/17(Wed) 10:04:49)
ログを取得するとありますので、時間単位で取得するように
してみてはいかがですか?


引用返信 編集キー/
■25230 / inTopicNo.3)  Re[2]: データを少しずつ抽出したい
□投稿者/ 鶏唐揚 (298回)-(2008/09/17(Wed) 10:14:18)
No25225 (HiJun さん) に返信
> ログを取得するとありますので、時間単位で取得するように
> してみてはいかがですか?
ありがとうございます
その方法も考えたのですが、3秒ごととか5秒ごとに出力されるものなので
1秒単位で条件を変更しつつループさせるのはナンセンスだと思いました

また<=や>=で一定時間範囲ごとにループ抽出しようかと思いましたが、
LIKE使った時のように遅くなったりしないでしょうか?
しないなら範囲抽出のループにしようと考えていますが、もし遅くなるとしたら
1時間単位なら24回も全件抽出時と同じ停止時間があるとマズいです…

よろしくお願いします
引用返信 編集キー/
■25231 / inTopicNo.4)  Re[3]: データを少しずつ抽出したい
□投稿者/ えちぜん (1回)-(2008/09/17(Wed) 10:18:21)
DataReaderを使うだけではだめなのでしょうか。
http://msdn.microsoft.com/ja-jp/library/haa3afyz(VS.80).aspx
ここには、
DataReader はバッファリングされないデータ ストリームを提供して、手続きロジックがデータ ソースからの結果を順番に効率的に処理できるようにします。DataReader はデータをメモリにキャッシュしないため、大量のデータを取得する場合に適しています。
と書いてあるのですが。

引用返信 編集キー/
■25235 / inTopicNo.5)  Re[3]: データを少しずつ抽出したい
□投稿者/ れい (794回)-(2008/09/17(Wed) 10:29:35)
No25230 (鶏唐揚 さん) に返信
> ■No25225 (HiJun さん) に返信
>>ログを取得するとありますので、時間単位で取得するように
>>してみてはいかがですか?
> ありがとうございます
> その方法も考えたのですが、3秒ごととか5秒ごとに出力されるものなので
> 1秒単位で条件を変更しつつループさせるのはナンセンスだと思いました
>
> また<=や>=で一定時間範囲ごとにループ抽出しようかと思いましたが、
> LIKE使った時のように遅くなったりしないでしょうか?
> しないなら範囲抽出のループにしようと考えていますが、もし遅くなるとしたら
> 1時間単位なら24回も全件抽出時と同じ停止時間があるとマズいです…
>

データ量が多い場合はDBからの転送時間がメインでしょうから、
そうすると時間は転送される件数に比例しますよね。
使用メモリも転送される件数に比例。

時刻に対しての大小演算子はインデックス効きますから
インデックスがきちんと機能していれば、(たぶん機能していなくても)、
時間範囲でのフィルタリングは十分に小さい時間しかかからないのではないかと。

1日に1回

・23時間以上前のログを抽出。23時間以上前のログを削除
・22時間以上前のログを抽出。22時間以上前のログを削除
・…
・1時間以上前のログを抽出・1時間以上前のログを削除
・今以前のログを抽出・今以前のログをを削除

とやって、
それでも時間がかかるようなら、もうログを溜めない方針でやるしかないかと。

半日に1回とか、1時間に1回取得して廃棄。みたいな。

> しかしできればストアドプロシージャ?を使いたくないと思い、こちらに質問させていただきました

私ならできればストアドプロシージャを使いたいと思います。
引用返信 編集キー/
■25241 / inTopicNo.6)  Re[4]: データを少しずつ抽出したい
□投稿者/ 鶏唐揚 (299回)-(2008/09/17(Wed) 10:40:45)
No25231 (えちぜん さん) に返信
> DataReaderを使うだけではだめなのでしょうか。
ありがとうございます!
DataReaderを使ったことが無く、先のブログのストアドが先に頭に入ってしまったので
完全に抜けてました…^^;

>■れいさん
>私ならできればストアドプロシージャを使いたいと思います。
今回は保守の関係上、ストアドに切り替えるのはかなりきついと判断したので
見送った次第です。


かなり簡単に1件ずつの抽出が可能になりましたので、速度どうなのか・とOutOfMemoryException発生しないか検証してみます
(数十万件じゃなくて100万件超でしたけど…)
引用返信 編集キー/
■25248 / inTopicNo.7)  Re[1]: データを少しずつ抽出したい
□投稿者/ はつね (850回)-(2008/09/17(Wed) 10:50:50)
はつね さんの Web サイト
No25223 (鶏唐揚 さん) に返信
> そこで、数件ごと抽出していく方法がないか調べていたところ、

RANK関数使って、1〜10件、11〜20件、みたいな取得は出来るよ。
↓未検証

SELECT *
FROM (SELECT hoge1,hoge2,RNAK() OVER (ORDRE BY 主キーを全て指定) AS RECNO
FROM hogehoge
WHERE ・・・・・・)
WHERE RECNO BETWEEN 1 TO 10
ORDER BY RECNO

引用返信 編集キー/
■25325 / inTopicNo.8)  Re[2]: データを少しずつ抽出したい
□投稿者/ 鶏唐揚 (300回)-(2008/09/17(Wed) 17:05:12)
>RANK関数使って、1〜10件、11〜20件、みたいな取得は出来るよ。
情報ありがとうございます。
今やっている 1件ずつ が遅かった場合に試してみます。
(VBコーディング的にどちらがラクか…も検証してみます)


すみません結果は明日になりそうです
引用返信 編集キー/
■25385 / inTopicNo.9)  Re[3]: データを少しずつ抽出したい
□投稿者/ 鶏唐揚 (301回)-(2008/09/18(Thu) 18:20:46)
すみませんちょっと他の仕事が難航してて確認できていません。

>DataReaderを使うだけではだめなのでしょうか
質問なのですが、Order Byでソートしたらやはり遅くなるんでしょうか…
(すみません試してる時間があまりないので即質問です)
引用返信 編集キー/
■25676 / inTopicNo.10)  Re[4]: データを少しずつ抽出したい
□投稿者/ 鶏唐揚 (307回)-(2008/09/24(Wed) 15:28:32)
報告遅くなりました

とりあえずOracleDataReaderを使用した1件ずつの抽出で、メモリ不足は回避できています。
速度低下の懸念も、テキスト書き出し処理のおかげ(?)で改修前とさほど変わらない状態となり、一件落着です。
速度追求してこの1件を引き摺る余裕もないので、解決とさせていただきます。

また10件ごと20件ごとの抽出法やストアドの活用等、皆様の意見は今後の参考にさせていただきます。

ありがとうございました
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -