[pgsql-jp: 41182] Re: 一時テーブルに関して

Kasahara Tatsuhito kasahara.tatsuhito @ gmail.com
2012年 8月 10日 (金) 01:40:58 JST


笠原と申します。

> 解決策としては、テーブルの作成と削除を明示的に行ない、
> 1つの関数内など短期間で使用するぶんにはなんら問題は
> 無いように思うのですが、間違っているでしょうか。
いえ、そのような用途であれば、一時テーブルを使う上で問題は無いと思います。

ただ、過去のPostgreSQLのバージョン(8.3より前)では、例えばPL/pgSQLで作成した
関数内での一時テーブルの使用がうまく行かないといった問題もありました。
# 上記は、厳密に言えば PL/pgSQLの仕様の影響ですが・・・
 PL/pgSQLで作成された関数がキャッシュされる関係で、複数回関数を実施した際、
 2回目の実施時に既に存在しない一時テーブルを処理対象にしてしまいエラーとなる
 問題がありました。
 http://wiki.postgresql.org/wiki/FAQ/ja

> 試してはいないのですが、pgpool-IIなどでコネクションプール
> を利用しているときは、ユーザー側でコネクションの制御が
> 難しくなるのでそのあたりが関係するのかなと思っています。
確かに、コネクションプールのような形態ですと、うっかり一時テーブルが
残存していたり、などの問題が発生しやすくなると思います。

他に、一時テーブルで問題になりそうな点としては下記が思いつきます。

・ autovacuumの対象外となってしまうため、ある程度の期間に渡って一時テーブルを
 運用し、かつそれなりの量のデータ投入や更新が実施される場合は、明示的な
 VACUUM/ANALYZEを行わないと性能劣化に結びつく。
・一時テーブルはセッションローカルのメモリに置かれ、基本的に上限はない。
 そのため、大量のセッションで大きな一時テーブルを利用してしまうと
 メモリの逼迫が発生しやすくなる。

個人的には、一時テーブルの生成/削除のタイミング、実存期間、(総)サイズ、
あくまで一時的なデータの保管場所である、といったものが
ユーザ側で管理/認識されていれば、そう問題にはならないと思います。


2012年8月9日 18:41 test <test2011y @ kotanikogyo.co.jp>:
> お世話になります。S.A.と申します。
>
> 「Postgresql 一時テーブル」をGoogleで検索すると、
> 上位に「PostgreSQLで一時テーブルは、そもそも使ってはいけない。」
> と書いてあるサイトが見つかります。
> http://www.nonsensecorner.com/wp25/?p=3888
> 多分なにか困られたことがあったのだと推察しているのですが、
> 理由が書いてないもので、何とも判断しかねています。
>
> 何か落とし穴があるにしても、原因や解決策がわかっていれば
> 問題ないのではと考えています。
>
> 試してはいないのですが、pgpool-IIなどでコネクションプール
> を利用しているときは、ユーザー側でコネクションの制御が
> 難しくなるのでそのあたりが関係するのかなと思っています。
> 解決策としては、テーブルの作成と削除を明示的に行ない、
> 1つの関数内など短期間で使用するぶんにはなんら問題は
> 無いように思うのですが、間違っているでしょうか。
>
> 何か落とし穴らしきものをご存じの方おられましたら教えてください。
>



-- 
Tatsuhito Kasahara
kasahara.tatsuhito _at_ gmail.com


pgsql-jp メーリングリストの案内