一回も披露したことのない豆知識

お世話になっております。
Oracle10gで テーブル単位でTemporary Tableが出来ないか
試行錯誤しております。

要件として、Webアプリケーションで100万件のデータをSelectします。
その際、全データを取得するには、遅すぎるので、分割して取得しています。
現在では、C#で、サーバ側で取得Temporary Table Insertして、そのデータを参照するようにしているのですが、
Insertが遅いのと、C#に一度持ってきていますので、メモリが不安な状態です。

これを、create global temporary table CRE_TABLE_NAME as select * from TABLE_NAME
にして、CRE_TABLE_NAMEを参照したいのですが、dropタイミングがつかめませんでした。
そこで、このテーブルが自動的にdropしたいのですが、何か良い案はありませんでしょうか?

思いついたのが、temporary tableにテーブル情報を保持して、sessionが切れた、時点で消えるのを利用して、テーブルdropのトリガーを記載しようと思ったのですが、そのトリガーを思いつきませんでした。

どなたか、代替案または、実装したことがある方、よろしくお願いします。

A 回答 (2件)

ごめんなさい、わかりません。



なんらかのイベントというかトリガーというかアクションによって、テンポラリ表領域に使用したテーブルを削除するように作成するしかないようですね。定期的に削除するジョブを走らせておくとか。

PRESERVE ROWSを指定して作成した場合、切捨てはするけれどDROP はしないですね。「CREATE GLOBAL TEMPORARY TABLE ~ as select * from」 だと、DROPしないといけないので使えませんね。
    • good
    • 0
この回答へのお礼

お手数おかけしてます。

そうなんです、Dropしないと残って行っちゃうのですよね
SQLServerみたいな #Table_Name とかあればよかったのですが、

1週間たっても他の人からレスないので、無理なのかも知れません。
もう少し悩んでみます。

ありがとうございました。今回は一度締め切ります。

お礼日時:2007/06/27 18:18

夜間バッチでは100万件単位のデータを扱ったことがあるのですが、オンラインではないので参考になるかどうかわかりませんが。



ものによっては、セッションはつながりっぱなしで、切れる時はWeb Serverまかせなのでタイミングはとりにくいかと。

集計処理なのでしょうか?
それとも表示処理なのでしょうか?
一括ダウンロード処理?

集計であれば差分更新、表示であれば表示範囲だけを処理するというロジックではだめなのでしょうか?設計とコーディングが面倒くさいですけど。

処理そのものの概要がわかるような情報をお願いします。
データベースそのものだけでの解決案は難しいかも?

この回答への補足

レスありがとうございます。
かなり、まだ悩んでいます。

参照を行うのに使用していまして、一度にクライアントに送信すると固まる?のでページングという意味で、やっております。

最初はfillで500件ずつ返していたのですが、その間にDMLが発生すると結果がつじつまがあわないことになり、NGになりました。

そこで、現在では、テンポラリにRowデータをシリアライズしてCLOBで保存しているのですが、なんせ件数だけに重く+メモリが不安です。

そこで、create table ~ as select * from ~でテーブルを作成して
そこを参照したかったのですが、今度はdropするタイミングがつかめませんでした。
テンポラリにこのテーブル情報を格納してテンポラリから自動で削除されるタイミングでこのテーブルもdrop出来ないかと考え中です。

このような感じですが、わかりますでしょうか?

引き続きよろしくお願いいたします。

補足日時:2007/06/22 20:20
    • good
    • 0

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