PostgreSQLのビューからデータを取得するクエリを実行した場合、ビューの生成クエリ自体もそのタイミングで行われているのでしょうか。

そうであるならビューから取得するようにしてもパフォーマンスがあがったりすることはないということですよね(サブクエリとあまり変わらないので。)

やりたいことはデータ取得済みの仮想表オブジェクトのようなものを作りたいのですが。データ取得用テーブルをひとつ作ってトリガーで中身が動的に書き変わるようなものを作ったりするのでしょうか。PostgreSQLのトリガーの使い方なども含めてどういった方法が考えられるのかなど教えてください

回答の条件
  • 1人5回まで
  • 登録:2009/01/23 01:43:14
  • 終了:2009/01/30 01:45:03

回答(1件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/01/23 04:17:00

ポイント60pt

(1)VIEWのパフォーマンス

CREATEの時点でパース(構文解析)が実施されているので

 SQL投入 → パース → プランニング(実行計画) → 実行

におけるパースの部分を大幅に短縮する事ができますし

プログラム作成時などにはコードが短くなることによって

誤字脱字によるトラブルなども減らせます。


しかしながら、

VIEWあるいはVIEWを含む問い合わせの内容が複雑な場合は

プランニング段階や実行段階で大きく時間を喰いますので

目に見えるほどの効果を得られない事も多々あります。


では、どちらを選択すべきなのかという事になりますが

何度も利用するようなものであれば、VIEWのほうが

サブクエリよりも効率UPを「期待できる」という程度になり

非常にあいまいな返答をせざるを得ないところです。


(2)トリガ

仮想表(つまりはview)を使うべきか、それとも

専用の表を用意しておいて動的にメンテしていくべきか・・・。

用途や利用頻度、そして何よりデータベースの構造が

判らないので判断つきかねますが、関数&トリガではなく

ルールを学んで用いたほうがよさそうに思います。


8.3.5マニュアル

トリガ

http://old.postgresql.jp/document/pg835doc/html/triggers.html

http://old.postgresql.jp/document/pg835doc/html/trigger-definiti...

ルール

http://old.postgresql.jp/document/pg835doc/html/rules.html

http://old.postgresql.jp/document/pg835doc/html/rules-triggers.h...


(3)どういった方法が・・・

更新の多いデータベースであれば

  サブクエリよりはVIEWを使って参照するのが良いかもしれません。

更新の少ないデータベースの場合は

  ルールあるいは関数&トリガにて

  参照用の表を実際に作ってしまうのが良いかもしれません。

いずれにしても

テーブルの正規化(あるいは非正規化)やインデックスの見直し

さらにやるなら、継承によるテーブルの小型化などなど・・・。

単純作業でデータを取り出せるようにする工夫が肝要となります。


以上、ヒントにでもなればよろしいのですが・・・。

id:tumblr

大変参考になります。

ルールという方法を知らなかったので調べてみます。

2009/01/23 08:30:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません